把打家劫舍二的问题分解为两种情况,可以按打家劫舍一的问题求解。
1.偷了第一家,没偷最后一家(相当于只遍历到倒数第二家的位置)
2.没偷第一家,偷了最后一家(相当于初始值为0,遍历到最后的位置)
分治的思想,原问题的答案可以分解为两个子问题的求解。
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param nums int整型一维数组
# @return int整型
#
class Solution:
def rob(self , nums: List[int]) -> int:
# write code here
l = len(nums)
dp1 = []
dp2 = []
# 偷了第一家,没偷最后一家
for i in range(l - 1):
if i == 0:
dp1.append(nums[i])
elif i == 1:
dp1.append(max(nums[i], dp1[i - 1]))
else:
dp1.append(max(nums[i] + dp1[i - 2], dp1[i - 1]))
# 没偷第一家,遍历到最后一位
for i in range(l):
if i == 0:
dp2.append(0)
elif i == 1:
dp2.append(nums[i])
else:
dp2.append(max(nums[i] + dp2[i - 2], dp2[i - 1]))
print(dp1, dp2)
return max(dp1[-1], dp2[-1])