Leetcode 第543,566,572,594,605,617,628,637,645,653题(Java解法)

一系列LeetCode题目(543,566,572,594,605,617,628,637,645,653)的Java解法。涉及二叉树直径、矩阵重塑、子树判断、和谐子序列、种花问题、合并二叉树、最大乘积、层平均值、错误集合和BST两数之和。
摘要由CSDN通过智能技术生成

第543题 二叉树的直径

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

示例 1:

      1
     / \
    2   3
   / \     
  4   5    
输入 输出
[1,2,3,4,5] 3

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

解题思路

不断找寻左右子树的深度,然后用结果数组记载每一个节点为根时的左右最大深度加1,不断递归更新这个值,最后返回最大的值-1

代码

// 二叉树的直径:dfs
class Solution {
   
    int ans;
    public int diameterOfBinaryTree(TreeNode root) {
   
        ans = 1;
        depth(root);
        return ans - 1;
    }
    public int depth(TreeNode node) {
   
        if (node == null) {
   
            return 0; // 访问到空节点了,返回0
        }
        int L = depth(node.left); // 左儿子为根的子树的深度
        int R = depth(node.right); // 右儿子为根的子树的深度
        ans = Math.max(ans, L+R+1); // 计算d_node即L+R+1 并更新ans
        return Math.max(L, R) + 1; // 返回该节点为根的子树的深度
    }
}

时间复杂度为O(n),n为二叉树的节点数
空间复杂度为O(h),h为二叉树的高度

第566题 重塑矩阵

在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。
给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。
如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

示例 1:

输入 输出
nums = [[1,2],[3,4]] r = 1, c = 4 [[1,2,3,4]]

解释:
行遍历nums的结果是 [1,2,3,4]。新的矩阵是 1 * 4 矩阵, 用之前的元素值一行一行填充新矩阵。

示例 2:

输入 输出
nums = [[1,2],[3,4]] r = 2, c = 4 [[1,2],[3,4]]

解释:
没有办法将 2 * 2 矩阵转化为 2 * 4 矩阵。 所以输出原矩阵。

解题思路

首先判断新老数组的大小是否一致,然后将老数组对列的长度进行除法和求余,转换成一位数组,再对新数组对新列进行除法和求余,把数字放入

代码

// 重塑矩阵:数组
class Solution {
   
    public int[][] matrixReshape(int[][] nums, int r, int c) {
   
        int m = nums.length;
        int n = nums[0].length;
        if (m * n != r * c) {
   
            return nums;
        }//判断新数组的大小是否与原数组相等
        int[][] ans = new int[r][c];
        for (int x = 0; x < m * n; ++x) {
   
            ans[x / c][x % c] = nums[x / n][x % n];
        }//将原数组转换为一维数组排序之后,再放置到新数组中
        return ans;
    }
}

时间复杂度为O( r ∗ c r*c rc),r,c分别为新数组的行和列的长度
空间复杂度为O(1)

第572题 另一个树的子树

给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。

示例 1:
给定的树 s:

    3
   / \
  4   5
 / \
1   2

给定的树 t:

  4 
 / \
1   2
输入 输出
[3,4,5,1,2] [4,1,2] true

返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。

示例 2:
给定的树 s:

    3
   / \
  4   5
 / \
1   2
   /
  0

给定的树 t:

  4 
 / \
1   2
输入 输出
[3,4,5,1,2,null,null,0] [4,1,2] false

解题思路

运用dfs对两树进行遍历,如果两树在一个节点上值相等,则继续进行进一步的核查,判断子树的值是否相等,以及是否出现一颗树无子节点,另一棵树有子节点的情况,直到遍历完两棵树

代码

// 另一个树的子树:dfs
class Solution {
   
    public boolean isSubtree(TreeNode s, TreeNode t) {
   
        return dfs(s, t);//深度优先搜索
    }
    public boolean dfs(TreeNode s, TreeNode t) {
   
        if (s == null
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值