1. 单调递增的数字
单调递增,前一位不能大于后一位
一旦大于 eg. 987
前一位 -1,977,并记录当前位置(2)
前一位 -1,877,并记录当前位置(1)
然后从记录的位置开始全部设置为 9 (确保最大)
899
class Solution {
public int monotoneIncreasingDigits(int n) {
char[] ch = String.valueOf(n).toCharArray();
int start = ch.length;
for(int i = ch.length - 1; i > 0; i--){
if(ch[i] < ch[i-1]){
ch[i-1]--;
start = i;
}
}
for (int i = start; i < ch.length; i++) {
ch[i] = '9';
}
return Integer.parseInt(String.valueOf(ch));
}
}
2. 监控二叉树
根据子节点判断当前节点是否需要放camera
从叶子节点开始(后序),叶子节点默认不放 camera(因为放在叶子节点浪费了一层监控范围)
向上一个节点,检测其叶子节点的状态
叶子节点只要有一个没有被覆盖到,那么这个节点放camera
相反,叶子节点都被覆盖了,那么这个节点就不需要放了,该节点状态为无覆盖
另外,叶子节点至少有一个camera,那么该节点就已经被覆盖了
最后注意单独检查root(因为递归中,只会返回根节点的孩子节点状态,需要再判断一次)
class Solution {
int res=0;
public int minCameraCover(TreeNode root) {
// 对根节点的状态做检验,防止根节点是无覆盖状态 .
if(minCame(root)==0){
res++;
}
return res;
}
/**
节点的状态值:
0 表示无覆盖
1 表示 有摄像头
2 表示有覆盖
后序遍历,根据左右节点的情况,来判读 自己的状态
*/
public int minCame(TreeNode root){
if(root==null){ // 到了叶子节点的空节点
// 空节点默认为 有覆盖状态,避免在叶子节点上放摄像头
return 2;
}
int left=minCame(root.left);
int right=minCame(root.right);
// 如果左右节点都覆盖了的话, 那么本节点的状态就应该是无覆盖,没有摄像头
if(left==2&&right==2){
//(2,2)
return 0;
}else if(left==0||right==0){
// 左右节点只要有一个无覆盖, 根节点此时应该放一个摄像头
// (0,0) (0,1) (0,2) (1,0) (2,0)
// 状态值为 1 摄像头数 ++;
res++;
return 1;
}else{
// 左右节点的 状态为 (1,1) (1,2) (2,1) 也就是左右节点至少存在 1个摄像头,
// 那么本节点就是处于被覆盖状态
return 2;
}
}
}
- 时间复杂度: O(n),需要遍历二叉树上的每个节点
- 空间复杂度: O(n)