Java解leetcode,助力面试之简单10道题(八)
第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 r∗c),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