代码随想录算法训练营Day37|贪心算法06

代码随想录算法训练营Day37|贪心算法06


文章目录

  • 代码随想录算法训练营Day37|贪心算法06
  • 一、738. 单调递增的数字
  • 二、968.监控二叉树


一、738. 单调递增的数字


class Solution {
    public int monotoneIncreasingDigits(int n) {
        String s = String.valueOf(n);
        char[] nChars = s.toCharArray();
        int len=nChars.length;
        //flag后面的所有都变成9,不单独设置是为了防止出现900这种结果
        //注意这里设的值,如果设为0,则原本单调递增则会全是999
        int flag=len;

        //从后向前遍历,防止出现错误
        for(int i=len-1;i>0;i--){
            if(nChars[i-1]>nChars[i]){

                nChars[i-1]--;
                flag=i;


            }

        }
        for(int i=flag;i<len;i++){
            nChars[i]='9';
        }
        return  Integer.parseInt(String.valueOf(nChars));

    }
}

二、968.监控二叉树

这个跳过,不过还是贴上答案,以便后续二刷和复习方便

class Solution {
    int  res=0;
    public int minCameraCover(TreeNode root) {
        // 对根节点的状态做检验,防止根节点是无覆盖状态 .
        if(minCame(root)==0){
            res++;
        }
        return res;
    }
    /**
     节点的状态值:
       0 表示无覆盖
       1 表示 有摄像头
       2 表示有覆盖
    后序遍历,根据左右节点的情况,来判读 自己的状态
     */
    public int minCame(TreeNode root){
        if(root==null){
            // 空节点默认为 有覆盖状态,避免在叶子节点上放摄像头
            return 2;
        }
        int left=minCame(root.left);
        int  right=minCame(root.right);

        // 如果左右节点都覆盖了的话, 那么本节点的状态就应该是无覆盖,没有摄像头
        if(left==2&&right==2){
            //(2,2)
            return 0;
        }else if(left==0||right==0){
            // 左右节点都是无覆盖状态,那 根节点此时应该放一个摄像头
            // (0,0) (0,1) (0,2) (1,0) (2,0)
            // 状态值为 1 摄像头数 ++;
            res++;
            return 1;
        }else{
            // 左右节点的 状态为 (1,1) (1,2) (2,1) 也就是左右节点至少存在 1个摄像头,
            // 那么本节点就是处于被覆盖状态
            return 2;
        }
    }
}

你可能感兴趣的:(代码随想录打卡,算法,贪心算法)