算法修炼Day37|● 738.单调递增的数字 ● 968.监控二叉树

86 阅读1分钟
题目:738. 单调递增的数字 - 力扣(LeetCode)
代码实现:
class Solution {
    public int monotoneIncreasingDigits(int n) {
        char[] ch = String.valueOf(n).toCharArray();
        int start = ch.length;
        for (int i = ch.length - 2; i >= 0; i--) {
            if (ch[i] > ch[i + 1]) {
                ch[i]--;
                start = i + 1;
            }
        }
        for (int i = start; i < ch.length; i++) {
            ch[i] = '9';
        }
        return Integer.parseInt(String.valueOf(ch));
    }
}
题目:968. 监控二叉树 - 力扣(LeetCode)
代码实现:
class Solution {
    int ans = 0;
    public int minCameraCover(TreeNode root) {
        if (minValue(root) == 0) {
            ans++;
        }
        return ans;
    }
    /*
    节点值的状态:
    0 表示无覆盖
    1 表示有摄像头
    2 表示有覆盖
     */
    public int minValue(TreeNode root) {
        if (root == null) return 2; // 空节点的处理逻辑为有覆盖,保证叶子节点为无覆盖的状态。
        // 后序遍历:左右中
        int left = minValue(root.left); // 左
        int right = minValue(root.right); // 右
        // 中
        if (left == 2 && right == 2) { // 左右孩子均有覆盖,则该节点设为无覆盖,也即0
            return 0;
        } else if (left == 0 || right == 0) { // 左右孩子中任一个没覆盖,则该节点设为有摄像头,也即1
            ans++; // 摄像头数+1
            return 1;
        } else { // 左右节点有一个为有摄像头的状态,则当前节点为有覆盖的状态,也即2
            return 2;
        }
    }
}