目录
题目:
代码(首刷看解析 2024年2月18日):
后序遍历,从叶子节点到根节点状态转移:
若左右孩子存在摄像头,则返回本节点被监视
若左右孩子存在未被监视,则返回本节点摄像头,并res++
若左右孩子都被监视,则返回本节点未被监视
class Solution {
private:
int res;
/*0代表未被监视区域,1代表被监视区域,2代表摄像头区域*/
int DFS(TreeNode* root) {
if (!root) return 1;
int left = DFS(root->left);
int right = DFS(root->right);
if (left == 0 || right == 0) {
res++;
return 2;
} else if (left == 2 || right == 2) {
return 1;
} else if (left == 1 && right == 1) {
return 0;
}
return 10;
}
public:
int minCameraCover(TreeNode* root) {
if (!root) return 0;
res = 0;
int _root = DFS(root);
if (_root == 0) res++;
return res;
}
};
代码(二刷看解析 2024年6月16日 go)
看到这个递归函数写在函数内部的写法我都惊了,不知道cpp可以不可以这样写,看的别人的代码。如果可以的话是用lambda表达式吗?
func minCameraCover(root *TreeNode) int {
res := 0
var helper func(cur *TreeNode) int
helper = func(cur *TreeNode) int {
if cur == nil {
return 1
}
left := helper(cur.Left)
right := helper(cur.Right)
// 本层要设置摄像头的情况:左右子树有任1没被覆盖
if left == 0 || right == 0 {
res++
return 2
}
// 本层要修改成被覆盖的情况:左右子树存在摄像头
if left == 2 || right == 2 {
return 1
}
return 0
}
if helper(root) == 0 {
res++
}
return res
}