198. 打家劫舍
分析
- 定义状态:
f[i]
:表示偷取第i
个房屋的最高金额g[i]
:表示不偷取第i
个房屋的最高金额
- 状态转移方程:
- 若偷第
i
个房屋:f[i] = g[i - 1] + nums[i - 1]
,即前一个房屋没有被偷,当前房屋可以偷取,累加其金额。 - 若不偷第
i
个房屋:g[i] = max(f[i - 1], g[i - 1])
,即第i
个房屋不被偷,其最优结果取决于前一个房屋偷或不偷的最大值
- 若偷第
- 初始化:
f[0] = 0
(没有房屋可偷)g[0] = 0
(没有房屋可偷)
- 结果:
- 最终的最大金额为:
max(f[n], g[n])
- 最终的最大金额为:
时间复杂度
遍历一次数组,时间复杂度为 O(n)
空间复杂度
使用两个长度为 n + 1
的数组,空间复杂度为 O(n)
C++代码
|
|