【代码随想录训练营】Day37-贪心算法

代码随想录训练营 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;
    }
}

你可能感兴趣的:(代码随想录训练营,leetcode,java,贪心算法)