738. 单调递增的数字
中等
提示
当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。
给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
不知道怎么讲思路……以9287举例,从后往前遍历,87肯定不是递增的,那么是递增又满足小于87的最大数应该是79,然后变成9279,轮到27不满足,变成19,现在是9119,现在91不满足,变成89,最后满足的是8999。总之就是前一位减一,后一位变9.
难点:如何提取到每一位的数字并方便修改?最好把每一位拿下来,放到一个数组里,方便修改。
class Solution {
public int monotoneIncreasingDigits(int n) {
String s = String.valueOf(n); //装箱
char[] chars = s.toCharArray();
// flag用来标记赋值9从哪里开始
// 设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行
int flag = chars.length;
for (int i = chars.length - 1; i > 0; i--) { // 后往前遍历
if ( chars[i] < chars[i - 1]) {
chars[i - 1]--;
// 标记不递增的地方是从哪里开始的,在那之后的都要变成9
// 比如 93232,会被改为 89999, 100,会被改为99
flag = i;
}
}
// 省略了下面这个不行,遇到100这种,过不去
for (int i = flag; i < chars.length; i++){
chars[i] = '9';
}
return Integer.parseInt(new String(chars)); // 或者 Integer.parseInt(String.valueOf(chars))
}
}
968. 监控二叉树
困难
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。