738.单调递增的数字
关键点1:int转成String,String转成char[]
关键点2:从后往前遍历,如果前一个数大于后一个数,那前一个数减减,记住后一个数的位置为flag,最后将flag到数组末尾都变成‘9’
关键点3:先转成String,再用Integer.parseInt转成int
class Solution {
public int monotoneIncreasingDigits(int n) {
String s = String.valueOf(n);
char[] chars = s.toCharArray();
int flag = chars.length;
for(int i = chars.length -1;i>0;i--){
if(chars[i-1] > chars[i]){
chars[i-1]--;
flag = i;
}
}
for(int i = flag;i< chars.length;i++){
chars[i] = '9';
}
// 先转成String,再用Integer.parseInt转成int
return Integer.parseInt(String.valueOf(chars));
}
}
968.监控二叉树
关键点1:用递归,后序遍历
关键点2:判断左右子节点的状态,依据左右子节点的状态反推上一级节点的状态
2-1:两个子节点都有覆盖,根则无覆盖
2-2:只要有一个是无覆盖,根则为摄像头
2-3:只要有一个是有摄像头,根则有覆盖
关键点3:主函数判断,if(minCame(root)==0),res++,最后返回res
class Solution {
int res=0;
public int minCameraCover(TreeNode root) {
// 对根节点的状态做检验,防止根节点是无覆盖状态 .
if(minCame(root)==0){
res++;
}
return res;
}
public int minCame(TreeNode root){
/*
节点的状态值:
0 表示无覆盖
1 表示 有摄像头
2 表示有覆盖
后序遍历,根据左右节点的情况,来判读 自己的状态
*/
if(root == null){
return 2;
}
int left = minCame(root.left);
int right = minCame(root.right);
if(left == 2 && right == 2){//两个子节点都有覆盖
return 0;
}else if(left == 0 || right == 0){//只要有一个是无覆盖
res++;
return 1;
}else{//只要有一个是有摄像头
return 2;
}
}
}