LeetCode 337. 打家劫舍 III
题目描述
思路分析
思路描述
参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func rob(root *TreeNode) int {
// 定义 dfs 返回值:两个状态 (偷、不偷)
var dfs func(*TreeNode) (int, int)
dfs = func(cur *TreeNode) (int, int) {
if cur == nil {
return 0, 0
}
// 分别计算左子树和右子树
leftRob, leftNoRob := dfs(cur.Left)
rightRob, rightNoRob := dfs(cur.Right)
// 偷当前节点
robCur := cur.Val + leftNoRob + rightNoRob
// 不偷当前节点
noRobCur := max(leftRob, leftNoRob) + max(rightRob, rightNoRob)
return robCur, noRobCur
}
resRob, resNoRob := dfs(root)
return max(resRob, resNoRob)
}
- 时间复杂度:O(n),其中 n 是二叉树中的节点数。
- 空间复杂度:O(h),其中 h 是二叉树的高度,递归栈的深度最坏为 O(n),平均为 O(log n)。
1
write your code here
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
本博客所有文章除特别声明外,均采用