modify code

master
algorithmzuo 1 year ago
parent bed46b4f43
commit 1730117df3

@ -16,6 +16,7 @@ public class Code01_CompleteTreeNodeNumber {
}
// 提交如下的方法
// head为头的树一定是完全二叉树保证这一点
public static int countNodes(TreeNode head) {
if (head == null) {
return 0;
@ -23,22 +24,26 @@ public class Code01_CompleteTreeNodeNumber {
return bs(head, 1, mostLeftLevel(head, 1));
}
// 当前来到node节点node节点在level层总层数是h
// 返回node为头的子树(必是完全二叉树),有多少个节点
// node : 当前来到的树的头部,当前这棵树一定是完全二叉树!
// Level : 在整棵大树中node在第几层
// h : 在整棵大树中,一共有几层
// 返回 : 以node为头的完全二叉树有几个节点
// 时间复杂度O((logN)的平方) ,远好于,都遍历一遍所有的节点
public static int bs(TreeNode node, int Level, int h) {
if (Level == h) {
return 1;
}
if (mostLeftLevel(node.right, Level + 1) == h) {
// (1 << (h - Level)) 就代表 : 2的(h-level)次方
return (1 << (h - Level)) + bs(node.right, Level + 1, h);
} else {
return (1 << (h - Level - 1)) + bs(node.left, Level + 1, h);
}
}
// 如果node在level层
// 求以node为头的子树最大深度是多少
// node为头的子树一定是完全二叉树
// node,此时在level层
// 请顺着node的left指针往下扎
// 返回最终的深度
public static int mostLeftLevel(TreeNode node, int level) {
while (node != null) {
level++;

@ -30,6 +30,7 @@ public class Code02_DiameterOfBinaryTree {
maxDistance = m;
height = h;
}
}
public static Info process(TreeNode x) {
@ -39,9 +40,10 @@ public class Code02_DiameterOfBinaryTree {
Info leftInfo = process(x.left);
Info rightInfo = process(x.right);
int height = Math.max(leftInfo.height, rightInfo.height) + 1;
int p1 = Math.max(leftInfo.maxDistance, rightInfo.maxDistance);
int p2 = leftInfo.height + rightInfo.height;
int maxDistance = Math.max(p1, p2);
// 可能性1&2 : 左树上的最大距离 右树上的最大距离 取最大值
int maxDistance = Math.max(leftInfo.maxDistance, rightInfo.maxDistance);
// 可能性3 : 左高 + 右高
maxDistance = Math.max(maxDistance, leftInfo.height + rightInfo.height);
return new Info(maxDistance, height);
}

@ -1,16 +1,39 @@
package 03.mca_04;
// 本题测试链接 : https://leetcode.cn/problems/longest-increasing-subsequence
public class Code06_LIS {
public class Code03_LIS {
public static int common(int[] arr) {
int n = arr.length;
int[] dp = new int[n];
// ...arr[0]
dp[0] = 1;
int maxLen = 1;
for (int i = 1; i < n; i++) {
int preLen = 0;
for (int j = 0; j < i; j++) {
if (arr[j] < arr[i]) {
preLen = Math.max(preLen, dp[j]);
}
}
dp[i] = preLen + 1;
maxLen = Math.max(maxLen, dp[i]);
}
return maxLen;
}
public static int lengthOfLIS(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
int[] ends = new int[arr.length];
// ends[i] : 所有长度为i+1的递增子序列最小结尾
// 0.....n-1
// 0 1...
ends[0] = arr[0];
int right = 0;
int max = 1;
// ends填到了哪
int right = 0;
for (int i = 1; i < arr.length; i++) {
int l = 0;
int r = right;
@ -22,8 +45,9 @@ public class Code06_LIS {
r = m - 1;
}
}
right = Math.max(right, l);
// l : 就是返回的下标
ends[l] = arr[i];
right = Math.max(right, l);
max = Math.max(max, l + 1);
}
return max;

@ -0,0 +1,41 @@
package 03.mca_04;
import java.util.Arrays;
// 给你一个二维整数数组 envelopes
// 其中 envelopes[i] = [wi, hi], 表示第 i 个信封的宽度和高度。
// 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里
// 如同俄罗斯套娃一样
// 请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封
// 即可以把一个信封放到另一个信封里面
// 注意:不允许旋转信封
// 本题测试链接 : https://leetcode.cn/problems/russian-doll-envelopes/
public class Code04_EnvelopesProblem {
public static int maxEnvelopes(int[][] envelopes) {
Arrays.sort(envelopes, (a, b) -> a[0] != b[0] ? (a[0] - b[0]) : (b[1] - a[1]));
int n = envelopes.length;
int[] ends = new int[n];
ends[0] = envelopes[0][1];
int right = 0;
int l = 0;
int r = 0;
int m = 0;
for (int i = 1; i < n; i++) {
l = 0;
r = right;
while (l <= r) {
m = (l + r) / 2;
if (envelopes[i][1] > ends[m]) {
l = m + 1;
} else {
r = m - 1;
}
}
right = Math.max(right, l);
ends[l] = envelopes[i][1];
}
return right + 1;
}
}

@ -1,4 +1,4 @@
package 03.mca_04;
package 03.mca_05;
// 测试链接 : https://www.nowcoder.com/questionTerminal/e7ed657974934a30b2010046536a5372
// 请务必理解这个文件的实现,而且还提供了测试链接

@ -1,4 +1,4 @@
package 03.mca_04;
package 03.mca_05;
// 有 n 个城市,其中一些彼此相连,另一些没有相连
// 如果城市 a 与城市 b 直接相连

@ -1,4 +1,4 @@
package 03.mca_04;
package 03.mca_05;
// n对情侣坐在连续排列的 2n 个座位上,想要牵到对方的手
// 人和座位由一个整数数组 row 表示,其中 row[i] 是坐在第 i 个座位上的人的ID

@ -1,4 +1,4 @@
package 03.mca_04;
package 03.mca_05;
import java.util.HashMap;
Loading…
Cancel
Save