本题难度其实不算特别高,应该算是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;}}}
