738.单调递增的数字
讲解链接:代码随想录-738.单调递增的数字
啥也不说了,看代码就好拉
public int monotoneIncreasingDigits(int n) {
String[] strings = String.valueOf(n).split("");
int flag = strings.length;
// 从后面开始寻找,找到不是单调递增的位置,然后把前一个数字-1
for (int i = strings.length - 1; i > 0; i--) {
int cur = Integer.valueOf(strings[i]);
int pre = Integer.valueOf(strings[i - 1]);
if (pre > cur) {
flag = i;
pre--;
strings[i - 1] = String.valueOf(pre);
}
}
// 从不是单调递增的位置开始替换成9,这样就是最接近的数字了。
for (int i = flag; i < strings.length; i++) {
strings[i] = "9";
}
return Integer.valueOf(String.join("", strings));
}
968.监控二叉树
讲解链接:代码随想录-968.监控二叉树
在叶子结点的父节点安装摄像头最省,这里使用后序遍历:左右中。需要遍历完子节点再处理中节点。我们需要定义 3 个值来获取当前节点属于什么类型。
0 = 叶子节点。
1 = 叶子结点父节点,也就是需要安装摄像头的节点。
2 = 安装摄像头的父节点;属于监控范围内。
然后我们就需要根据不同情况来返回值和增加摄像头数了。
- 当两个子节点都是 2 时,返回 0。
- 当子节点值存在 0 时,就需要给当前节点安装摄像头。
- 其余情况全部返回 2,包括 null 的时候。
int result = 0;
public int minCameraCover(TreeNode root) {
if (travseral(root) == 0) {
result++;
}
return result;
}
Integer travseral(TreeNode node) {
if (node == null) return 2;
int left = travseral(node.left);
int right = travseral(node.right);
if (left == 2 && right == 2) {
return 0;
} else if (left == 0 || right == 0) {
result++;
return 1;
} else {
return 2;
}
}