LeetCode 337. 打家劫舍 III

题目描述

337. 打家劫舍 III

image-20250419000557407

image-20250419000609853

思路分析

思路描述

参考代码

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)。

➡️ 点击查看 Java 题解

1
write your code here
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/99943604
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!