贪心
class Solution {
int num = 0;
public int minCameraCover(TreeNode root) {
/**
* 如果根节点未被监视,需要单独放一个摄像头
*/
if (dfs(root) == 0){
num++;
}
return num;
}
/**
* 每个节点可能有的三种状态:
* 0:本节点未被监视
* 1:本节点被监视
* 2:本节点有摄像头
*/
public int dfs(TreeNode root){
/**
* 空节点默认被监视
*/
if (root == null){
return 1;
}
/**
* 后序遍历,因为叶子节点数量最多
* 局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少!
*/
int left = dfs(root.left);
int right = dfs(root.right);
/**
* 如果有孩子没有被监视,那父节点需要摄像头
*/
if (left == 0 || right == 0){
num++;
return 2;
}
/**
* 如果两个孩子都已经被监视了,那父节点再装摄像头就浪费了,设置为没有被监视的状态
*/
if (left == 1 && right == 1){
return 0;
}
/**
* 其他情况,设置为被监视状态
*/
return 1;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(logn)
*/
https://leetcode-cn.com/problems/binary-tree-cameras/