【简单版】【Java语言刷Leetcode一5道题】Day4

时间:2023-02-03 16:04:42
  • ???? 作者:烧洋芋的土豆
  • ???? 内容:使用Java语言刷Leetcode算法题第四天
  • ???? 技术交流:分享日常学习知识,平常遇到的问题,一些学习资料,一起学习,一起进步。

( )

???? 88. 合并两个有序数组

        给你两个按非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你合并nums2到nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:         最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

示例 1:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 输出:[1,2,2,3,5,6] 解释:需要合并 [1,2,3] 和 [2,5,6] 。 合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

示例 2:

输入:nums1 = [1], m = 1, nums2 = [], n = 0 输出:[1] 解释:需要合并 [1] 和 [] 。 合并结果是 [1] 。

示例 3:

输入:nums1 = [0], m = 0, nums2 = [1], n = 1 输出:[1] 解释:需要合并的数组是 [] 和 [1] 。 合并结果是 [1] 。 注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。

提示:

  • nums1.length == m + n
  • nums2.length == n
  • 0 <= m, n <= 200
  • 1 <= m + n <= 200
  • -109 <= nums1[i], nums2[j] <= 109

方法一:快速排序模式

代码和结果图如下:

    public static void merge(int[] nums1, int m, int[] nums2, int n) {
        for (int i = 0; i != n; i++) {
            nums1[m+i]=nums2[i];
        }
        Arrays.sort(nums1);
        List<Integer> collect = Arrays.stream(nums1).boxed().collect(Collectors.toList());
        System.out.println(collect);
    }

复杂分析度:

  1. 时间复杂度:O(m+n)log(m+n)) 排序长度为m+n,套用快速排序的时间复杂度,平均为O(m+n)log(m+n))
  2. 空间复杂度:O(log(m+n)) 排序序列长度为m+n 套用快速排序的空间复杂度,平均为O(log(m+n))

【简单版】【Java语言刷Leetcode一5道题】Day4

方法二:逆向双指针

代码和结果图如下:

 int p1 = m-1, p2 = n-1;
        int tail=m+n-1;
        int cur;
        while (p1>=0 ||p2>=0){
            if(p1 ==-1){
                cur=nums2[p2--];
            }else if(p2 == -1){
                cur=nums1[p1--];
            } else  if(nums1[p1]>nums2[p2]){
                cur=nums1[p1--];
            }else {
                cur=nums2[p2--];
            }
            nums1[tail--]=cur;
        }

        List<Integer> collect = Arrays.stream(nums1).boxed().collect(Collectors.toList());
        System.out.println(collect);

复杂分析度:

  1. 时间复杂度:O(m+n) 因为数组是有序的,指针移动单调递减,最多移动m+n次,时间复杂度为O(m+n)
  2. 空间复杂度:O(1) 直接对数组原地修改,不需要额外的空间

【简单版】【Java语言刷Leetcode一5道题】Day4

???? 94. 二叉树的中序遍历

       给定一个二叉树的根节点 root ,返回它的中序遍历 。

注意:

不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1: 【简单版】【Java语言刷Leetcode一5道题】Day4

输入:root = [1,null,2,3] 输出:[1,3,2]

示例 2:

输入:root = [] 输出:[]

示例 3:

输入:root = [1] 输出:[1]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

代码和结果图如下:

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> list=new ArrayList<>();
    //判断是否是空树
    if(root == null){
        return list;
    }
    Stack<Object> stack=new Stack<>();
    stack.push(root);
    while(!stack.isEmpty()){
        Object obj = stack.pop();
        //第一次出栈
        if(obj instanceof TreeNode){
            TreeNode node=(TreeNode) obj;
            if(node.right!=null){
                stack.push(node.right);
            }
            stack.push(node.val);
            if(node.left!=null){
                stack.push(node.left);
            }
        }
        //第二次出栈
        else{
            list.add((Integer) obj);
        }
    }
    return list;
    }
}

【简单版】【Java语言刷Leetcode一5道题】Day4

???? 100. 相同的树

       给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1: 【简单版】【Java语言刷Leetcode一5道题】Day4

输入:p = [1,2,3], q = [1,2,3] 输出:true

示例 2: 【简单版】【Java语言刷Leetcode一5道题】Day4

输入:p = [1,2], q = [1,null,2] 输出:false

示例 3: 【简单版】【Java语言刷Leetcode一5道题】Day4

输入:p = [1,2,1], q = [1,1,2] 输出:false

提示:

  • 两棵树上的节点数目都在范围 [0, 100] 内
  • -104 <= Node.val <= 104

代码和结果图如下:

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
          if(p ==null && q==null){
              return true;
          }
            if(p ==null ||q==null){
            return false;
            }
        if(p.val==q.val){
            return isSameTree(p.left,q.left)&& isSameTree(p.right,q.right);
        }
        return false;
    }
}

【简单版】【Java语言刷Leetcode一5道题】Day4

???? 101. 对称二叉树

       给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1: 【简单版】【Java语言刷Leetcode一5道题】Day4

输入:root = [1,2,2,3,4,4,3] 输出:true

示例 2: 【简单版】【Java语言刷Leetcode一5道题】Day4

输入:root = [1,2,2,null,3,null,3] 输出:false

提示:

  • 树中节点数目在范围 [1, 1000] 内
  • -100 <= Node.val <= 100

代码和结果图如下:

解析:

相当于照镜子,看是否相同,因为刚好是反向的

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
        public boolean isSymmetric(TreeNode root) {
            return isMirror(root, root);
        }

        public boolean isMirror(TreeNode t1, TreeNode t2) {
            if (t1 == null && t2 == null) return true;
            if (t1 == null || t2 == null) return false;
            return (t1.val == t2.val)
                    && isMirror(t1.right, t2.left)
                    && isMirror(t1.left, t2.right);
        }

【简单版】【Java语言刷Leetcode一5道题】Day4

???? 104. 二叉树的最大深度

       给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例 :

给定二叉树 [3,9,20,null,null,15,7], 【简单版】【Java语言刷Leetcode一5道题】Day4 返回它的最大深度 3 。

代码和结果图如下:

class Solution {
    public int maxDepth(TreeNode root) {
        return root == null ? 0 : Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
    }
}

【简单版】【Java语言刷Leetcode一5道题】Day4


???? 总结

       这几道算法题主要是采用Java基础知识和一些方法来实现的,这是刷算法题的第四天,期待我们后续越来越长,坚持下来就是胜利。