代码随想录算法训练营 Day 37 | 738.单调递增的数字,968.监控二叉树

738.单调递增的数字

讲解链接:代码随想录-738.单调递增的数字

啥也不说了,看代码就好拉

public int monotoneIncreasingDigits(int n) {
    String[] strings = String.valueOf(n).split("");
    int flag = strings.length;
    // 从后面开始寻找,找到不是单调递增的位置,然后把前一个数字-1
    for (int i = strings.length - 1; i > 0; i--) {
        int cur = Integer.valueOf(strings[i]);
        int pre = Integer.valueOf(strings[i - 1]);
        if (pre > cur) {
            flag = i;
            pre--;
            strings[i - 1] = String.valueOf(pre);
        }
    }
    // 从不是单调递增的位置开始替换成9,这样就是最接近的数字了。
    for (int i = flag; i < strings.length; i++) {
        strings[i] = "9";
    }
    return Integer.valueOf(String.join("", strings));
}

968.监控二叉树

讲解链接:代码随想录-968.监控二叉树

在叶子结点的父节点安装摄像头最省,这里使用后序遍历:左右中。需要遍历完子节点再处理中节点。我们需要定义 3 个值来获取当前节点属于什么类型。

0 = 叶子节点。
1 = 叶子结点父节点,也就是需要安装摄像头的节点。
2 = 安装摄像头的父节点;属于监控范围内。

然后我们就需要根据不同情况来返回值和增加摄像头数了。

  1. 当两个子节点都是 2 时,返回 0。
  2. 当子节点值存在 0 时,就需要给当前节点安装摄像头。
  3. 其余情况全部返回 2,包括 null 的时候。
int result = 0;
public int minCameraCover(TreeNode root) {
    if (travseral(root) == 0) {
        result++;
    }
    return result;
}

Integer travseral(TreeNode node) {
    if (node == null) return 2;
    int left = travseral(node.left);
    int right = travseral(node.right);

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

总结

代码随想录-贪心算法总结

你可能感兴趣的:(贪心算法,算法,leetcode)