本题难度其实不算特别高,应该算是Hard里面比较容易的,但是确实没有想到。
难点:
- 要想明白Greedy在本题中是可行的:自下而上进行Greedy操作,如果不到万不得已,不新添加Camera.
- Case 1: 左右子树都被监控,但是没有Camera,则本节点目前是未被监控状态,但是不需要Camera
- Case 2: 左子树或者右子树未被监控,此时本节点必须有Camera!
- Case 3,其他,则本节点是被监控状态,但是不需要Camera
- 左右都有Camera
- 一边有Camera,另一边被监控,无Camera
- 左右都有Camera
- Case 1: 左右子树都被监控,但是没有Camera,则本节点目前是未被监控状态,但是不需要Camera
想明白Greedy为什么在Bottom-Up的思路下成立,本题的难度就是一道普通的Medium,代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private static final int NOT_MONITOR = 0;
private static final int MONITOR_NO_CAMERA = 1;
private static final int MONITOR_CAMERA = 2;
private int camera = 0;
public int minCameraCover(TreeNode root) {
int state = DFSHelper(root);
return camera + (state == NOT_MONITOR ? 1 : 0);
}
private int DFSHelper(TreeNode node) {
if (node == null) {
return MONITOR_NO_CAMERA;
}
int l = DFSHelper(node.left);
int r = DFSHelper(node.right);
if (l == NOT_MONITOR || r == NOT_MONITOR) {
++camera;
return MONITOR_CAMERA;
}
else if (l == MONITOR_NO_CAMERA && r == MONITOR_NO_CAMERA) {
return NOT_MONITOR;
}
else {
// (l == MONITOR_NO_CAMERA && r == MONITOR_CAMERA), (l == MONITOR_CAMERA && r == MONITOR_NO_CAMERA)
return MONITOR_NO_CAMERA;
}
}
}