这里写目录标题
Leecode
738. 单调递增的数字
从后向前遍历:
原因这里讲的很好
例如98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]减一,strNum[i]赋值9,这个整数就是89。从后往前遍历,不符合递增的赋为9
class Solution {
public int monotoneIncreasingDigits(int n) {
String s = String.valueOf(n);
char[] chars = s.toCharArray();
int start = chars.length;
for(int i=chars.length-2;i>=0;i--){
if(chars[i]>chars[i+1]){
chars[i]--;
start =i+1; //注意是当前值减1,后面的变成9,所以是i+1
}
}
for(int i=start;i<chars.length;i++){
chars[i] = '9';
}
return Integer.parseInt(String.valueOf(chars));
}
}
968.监控二叉树
每个节点可能有几种状态:
有如下三种:代码随想录文字版解析
该节点无覆盖
本节点有摄像头
本节点有覆盖
我们分别有三个数字来表示:
0:该节点无覆盖
1:本节点有摄像头
2:本节点有覆盖
class Solution {
private final int NOT_MONITORED =0; // 没有被监控的
private final int MONITORED_YES =1;// 本节点被监控
private final int MONITORED_NO = 2; //本节点被监控覆盖到
private int camera;
public int minCameraCover(TreeNode root) {
if(root == null){
return 0;
}
camera =0;
int top = helper(root);
return camera + (top == NOT_MONITORED?1:0);
}
private int helper(TreeNode root){
if(root == null){ //空节点
return MONITORED_NO;
}
int left = helper(root.left);
int right = helper(root.right);
if(left == MONITORED_NO && right == MONITORED_NO){ // 左右两个节点都被监测到了
return NOT_MONITORED;
}else if(left == NOT_MONITORED || right == NOT_MONITORED){ //左右两边至少有一个没有被监测到
camera++;
return MONITORED_YES;
}else{
return MONITORED_NO;
}
}
}