代码随想录-2023/08/03

78 阅读1分钟

贪心算法

738.单调递增的数字

贪心思路

  1. 从后向前遍历数字的每一位
  2. 若发现前面的比当前大, 则将前面的-1, 后面的全部变成9

代码:

class Solution {
    public int monotoneIncreasingDigits(int n) {
        char[] ch = String.valueOf(n).toCharArray();
        for(int i=ch.length-1; i>0; i--) {
            if(ch[i]-'0' < ch[i-1] - '0') {
                // 字符-- 代表变成其ascii编码的前一个字符
                ch[i-1]--;
                Arrays.fill(ch, i, ch.length, '9');
            }
        }

        return Integer.parseInt(new String(ch));
    }
}

968.监控二叉树

树上贪心:

  1. 前序深度优先遍历: 遍历到的节点分为三种状态
  2. -1 - 代表叶子节点 || 不用管
  3. 1 - 代表当前节点没有安装摄像头
  4. 2 - 代表当前节点安装有摄像机

代码:

class Solution {
    int ans = 0;
    // 三种状态: 叶子节点(已经被监控的节点)-不用管, 当前位置没有安装摄像头, 当前位置安装了摄像头
    public int minCameraCover(TreeNode root) {
        // 判断根节点是否被监控
        return dfs(root) == 1 ? ans+1 : ans;
    }
    public int dfs(TreeNode root) {
        // 叶子节点用-1标识
        if(root == null) return -1;
        int left = dfs(root.left);
        int right = dfs(root.right);
        // 定义状态: 
        // -1 - 代表叶子节点 || 不用管
        // 1 - 代表当前节点没有安装摄像头
        // 2 - 代表当前节点安装有摄像机
        
        // 叶子节点不用安装摄像头
        if(left == -1 && right == -1) {
            return 1;
        }else {
            if(left == 1 || right == 1) {
                ans++;
                return 2;
            // 2和-1搭配时 向上返回 -1 
            }else return -1;
        }
    
    }
}