题解
动态规划
d
p
[
i
]
dp[i]
dp[i]表示到第
i
i
i个房屋的偷窃最高金额。
显然,递推公式为:
d
p
[
i
]
=
m
a
x
(
d
p
[
i
−
2
]
+
n
u
m
s
[
i
−
1
]
,
d
p
[
i
−
1
]
)
dp[i]=max(dp[i-2]+nums[i-1],dp[i-1])
dp[i]=max(dp[i−2]+nums[i−1],dp[i−1])。
含义为,当前房屋的最高金额为前前个房屋的最高金额加上当前房屋的财富和上一个房屋的最高偷窃金额中的最大值。
-
特判,若数组为空,返回 0 0 0
-
初始化 d p = [ 0 , ⋯ , 0 ] dp=[0,\cdots,0] dp=[0,⋯,0]为 n + 1 n+1 n+1的全零数组。
-
初始化第一个房屋的最高偷窃金额: d p [ 1 ] = n u m s [ 0 ] dp[1]=nums[0] dp[1]=nums[0]
-
遍历 d p dp dp,遍历区间 [ 2 , n + 1 ) [2,n+1) [2,n+1):
- d p [ i ] = m a x ( d p [ i − 2 ] + n u m s [ i − 1 ] , d p [ i − 1 ] ) dp[i]=max(dp[i-2]+nums[i-1],dp[i-1]) dp[i]=max(dp[i−2]+nums[i−1],dp[i−1])
-
返回 d p [ n ] dp[n] dp[n]
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
Python
class Solution:
def rob(self, nums: List[int]) -> int:
if(not nums):
return 0
n=len(nums)
dp=[0]*(n+1)
dp[1]=nums[0]
for i in range(2,n+1):
dp[i]=max(dp[i-2]+nums[i-1],dp[i-1])
return dp[-1]