单调递增的数字
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。
(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)
示例 1:
- 输入: N = 10
- 输出: 9
示例 2:
- 输入: N = 1234
- 输出: 1234
示例 3:
- 输入: N = 332
- 输出: 299
说明: N 是在 [0, 10^9] 范围内的一个整数
public int monotoneIncreasingDigits(int n){
String s=String.valueOf(n);
char[] chars = s.toCharArray();
int start=s.length();//记录从什么地方开始变成9
//从倒数第二个数组开始遍历,这个数如果不比后面的数大,那么这个数就-1,后面的数后序变成9
for (int i = chars.length-2; i >=0 ; i--) {
if (chars[i]>chars[i+1]){
chars[i]--;
start=i+1;
}
}
for (int i = start ; i < s.length(); i++) {
chars[i]='9';
}
return Integer.parseInt(String.valueOf(chars));
}
监控二叉树
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
示例 1:
- 输入:[0,0,null,0,0]
- 输出:1
- 解释:如图所示,一台摄像头足以监控所有节点。
int res=0;
public int minCameraCover(TreeNode root) {
//处理根节点
if (minCame(root)==0){//本节点无覆盖
res++;
}
return res;
}
/**
* 后序遍历
* 节点状态:
* 0:无覆盖
* 1:有摄像头
* 2:有覆盖
* @param root
* @return
*/
private int minCame(TreeNode root){
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;
}
}