题目:原题链接(中等)
标签:动态规划
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
---|---|---|---|
Ans 1 (Python) | O ( N ) O(N) O(N) | O ( N ) O(N) O(N) | 40ms (57.73%) |
Ans 2 (Python) | |||
Ans 3 (Python) |
解法一:
class Solution:
def rob(self, nums: List[int]) -> int:
if len(nums) == 1:
return nums[0]
size = len(nums)
# 偷第1家的情况
dp1 = [[0] * 2 for _ in range(size)] # dp[i][0]=偷了这一家的最大值,dp[i][1]=没偷这一家的最大值
dp1[0] = [nums[0], 0]
for i in range(1, size - 1):
dp1[i][0] = dp1[i - 1][1] + nums[i]
dp1[i][1] = max(dp1[i - 1][0], dp1[i - 1][1])
dp1[-1][1] = max(dp1[-2][0], dp1[-2][1]) # 最后1不能偷
# 没偷第1家的情况
dp2 = [[0] * 2 for _ in range(size)]
for i in range(1, size):
dp2[i][0] = dp2[i - 1][1] + nums[i]
dp2[i][1] = max(dp2[i - 1][0], dp2[i - 1][1])
return max(dp1[-1][1], dp2[-1][0], dp2[-1][1])