LeetCode 打卡day37 --监控树, 单调递增的数字


知识总结

贪心算法最后一章节, 巧在思路。


Leetcode 738. 单调递增的数字

题目链接

题目说明

当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
在这里插入图片描述

代码说明

算法思路: 从右往左遍历,碰到num[i] > num[i+1], 比如98, 那就将这个9减1,高位变成9. 最后就变成89

class Solution {
    
    
    public int monotoneIncreasingDigits(int n) {
    
    
        String s = String.valueOf(n);
        char[] list = s.toCharArray();
        int start = s.length();
        for(int i = list.length -2; i>= 0; i--){
    
    
            if(list[i] > list[i+1]){
    
    
                list[i] = (char) (list[i] - 1);
                start = i+1;
            }
        }

        for(int i = start; i< list.length; i++){
    
    
            list[i] = '9';
        }
        return Integer.parseInt(String.valueOf(list));
    }
}

Leetcode 968. 监控二叉树

题目链接

题目说明

给定一个二叉树,我们在树的节点上安装摄像头。

节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。

计算监控树的所有节点所需的最小摄像头数量。
在这里插入图片描述

代码说明

从叶子节点到根节点从下到上的遍历, 采取后续遍历的方法。
分三种情况来讨论。

class Solution {
    
    
    int result = 0;
    public int minCameraCover(TreeNode root) {
    
    
        // 0 no cover
        // 1 cover but no camera
        // 2 camera

        if(dfs(root) == 0){
    
    
            result++;
        }
        return result;
    }

    public int dfs(TreeNode cur){
    
    
        if(cur == null){
    
    
            return 1;
        }

        int left = dfs(cur.left);
        int right = dfs(cur.right);

        if(left == 0 || right == 0){
    
    
            result++;
            return 2;
        }

        if(left == 2 || right == 2){
    
    
            return 1;
        }
        // left == 1 && right == 1
        return 0; 
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45872648/article/details/131245577