力扣算法学习day26-2

文章目录

  • 力扣算法学习day26-2
    • 968-监控二叉树
      • 题目
      • 代码实现

力扣算法学习day26-2

968-监控二叉树

题目

力扣算法学习day26-2_第1张图片

力扣算法学习day26-2_第2张图片

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int sum = 0;// 记录摄像头的数量
    public int minCameraCover(TreeNode root) {
        // 贪心(个人思考最直接想出的方法,即常规) 速度:0ms
        // 由二叉树的性质,很容易推出:1.叶子结点肯定需要在父节点或叶子结点本身放置一个摄像头,然后才能看到。
        // 故,这里放父节点很明显会更好,因为父节点可能会还有父节点,即能照到更多的结点。而这里考虑
        // 使用后序遍历,那么是从子节点依次往上,当前结点的话就可以查看子节点是否已经被摄像头覆盖。
        // 局部最优:必须放置的情况放置 --> 全局最优:最小摄像头数量。
        int result = postOrderTheQuestion(root);
        if(result == 2){// 根结点需要单独看一哈。
            sum++;
        }
        
        return sum;
    }
    // 2:需要相机(由叶子结点或未覆盖结点返回),sum++
    // 1:被覆盖(由相机返回)。
    // 0:未覆盖,所以父节点需要设置相机,故返回2。
    // 思想:由下往上,叶子结点为第一个遇到的未覆盖结点,故需要返回2,让父节点设置相机,父节点再往上即
    //      为覆盖范围边界,为1,故返回的值再减1为0表示下个结点没覆盖,但是那个点有左右两个结点的返回值,
    //      而覆盖有一边覆盖即可,故只有同时为零时,是真的没有被覆盖,需要向上返回2,让父节点安装一个相机。
    public int postOrderTheQuestion(TreeNode node){
        if(node.left == null && node.right == null){
            return 2;
        }

        int left = 0;
        int right = 0;
        if(node.left != null){
            left = postOrderTheQuestion(node.left);
        }
        if(node.right != null){
            right = postOrderTheQuestion(node.right);
        }

        // 注:因为只要有1说明被覆盖了,2则说明需要放相机了也相当于覆盖了,只有同时为0代表没有覆盖。
        int result = Math.max(left,right);
        
        if(result == 2){
            sum++;
        }
        if(result > 0){
            return result-1;
        } else{
            return 2;
        }
    }
}

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