代码随想录训练营 Day37
今日任务
738.单调递增的数字
968.监控二叉树
语言:Java
738. 单调递增的数字
链接:https://leetcode.cn/problems/monotone-increasing-digits/
一旦某一位改成9,为了保证是最大的按位单调递增数字,后面的所有位都要改成9,所以在第一次循环的过程中,我们要找到最左边的9,而不是在循环过程中仅仅修改9;比如100,如果在第一次for中仅仅是修改某几位为9,最后得到的结果是90,而不是99。
class Solution {
public int monotoneIncreasingDigits(int n) {
String s = String.valueOf(n);
int[] arr = new int[s.length()];
for(int i = 0; i < s.length(); i++){
arr[i] = s.charAt(i) - '0';
}
int flag = s.length();
for(int i = s.length() - 1; i > 0; i--){
if(arr[i - 1] > arr[i]){
//arr[i] = 9;
flag = i;
arr[i - 1]--;
}
}
for(int i = flag; i < s.length(); i++){
arr[i] = 9;
}
int res = 0;
for(int i = 0; i < arr.length; i++){
res = res * 10 + arr[i];
}
return res;
}
}
968. 监控二叉树
链接:https://leetcode.cn/problems/binary-tree-cameras/
很妙的思路:不在叶子节点放摄像头,否则会浪费覆盖范围,从下向上放置摄像头
/**
* 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 result = 0;
public int traversal(TreeNode root){
//0-节点无覆盖
//1-节点有摄像头
//2-节点被覆盖以及null节点
if(root == null) return 2;
int left = traversal(root.left);
int right = traversal(root.right);
//左/右节点至少有一个未被覆盖
//此时需要当前节点加一个摄像头
if(left == 0 || right == 0){
result++;
return 1;
}
//左/右节点至少有一个摄像头
//当前节点被覆盖
else if(left == 1 || right == 1) return 2;
//左右节点都被覆盖
//当前节点未被覆盖
else if(left == 2 && right == 2) return 0;
return 3; //走不到这里
}
public int minCameraCover(TreeNode root) {
//根节点未被覆盖
//需要在根节点加一个摄像头
if(traversal(root) == 0){
result++;
}
return result;
}
}