单调递增的数字
题目:当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。
给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
思路:从后往前遍历,如果前一个数字大于后一个数字那么就把前一个数字减1,然后把当前数字变成9,以此类推
class Solution {
public int monotoneIncreasingDigits(int n) {
String s = String.valueOf(n);
// 转成字符串数组
char[] cs = s.toCharArray();
// 记录需要把后续数字全部变成9的下标
int flag = cs.length;
for(int i = cs.length - 1;i>0;i--){
// 当前数字小于前一个数字
if(cs[i-1] > cs[i]){
// 前一个数字减1
cs[i-1]--;
// 更新flag
flag = i;
}
}
for(int i = flag;i<cs.length;i++){
cs[i] = '9';
}
return Integer.parseInt(new String(cs));
}
}
监控二叉树
题目:给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
疑问:本题有点太难了,二刷的时候在来看看,有没有新的想法,目前就是有一种情况是不太理解的就是为什么左右孩子都是有覆盖的时候,父节点是无覆盖的
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int res = 0;
public int minCameraCover(TreeNode root) {
// 处理最后根节点没有覆盖的情况
if(traversal(root) == 0){
res++;
}
return res;
}
// 0表示无覆盖
// 1表示有摄像头
// 2表示有覆盖
private int traversal(TreeNode node){
if(node == null){
// 因为叶子节点的处理是尽力在叶子节点的父节点放摄像头,所有叶子节点的孩子(null)返回2
return 2;
}
// 左
int left = traversal(node.left);
// 右
int right = traversal(node.right);
// 中
if(left == 2 && right == 2){
// 如果左右孩子都是有覆盖的那么父节点就是无覆盖的
return 0;
}
if(left == 0 || right == 0){
// 如果左右孩子有一个是无覆盖的那么父节点就放摄像头
res++;
return 1;
}
if(left == 1 || right == 1){
// 如果左右孩子有一个是有摄像头的那么父节点一定是覆盖的
return 2;
}
// 无意义,语法要求
return -1;
}
}