本题是打家劫舍的升级版,将原先的队列变成了一个循环队列,首尾相连,头和尾的家只能选其一,所以可以分作两种情况
①取头,在取了第一间房子的情况下,最后一件房子不再做考虑,可将当前队列去尾后,放入打家劫舍的代码中
②取尾,在取了最后一间房子的情况下,第一件房子不再做考虑,可将当前队列去头后,放入打家劫舍的代码中
最后,再取两种情况下最大的即可
class Solution:
def rob(self,nums):
if len(nums) == 1:
return nums[0]
if len(nums) == 2:
return max(nums[0],nums[1])
nums1=nums[0:len(nums)-1]
nums2=nums[1:len(nums)]
result1=self.rob1(nums1)
result2=self.rob1(nums2)
return max(result2,result1)
def rob1(self, nums):
if len(nums) > 1:
tmp={0:nums[0],1:max(nums[1],nums[0])}
if nums[0] > nums[1]:
index = 0
else:
index = 1
else:
tmp={0:nums[0]}
index=0
for index in range(2,len(nums)):
tmp[index]=max(tmp[index-2]+nums[index],tmp[index-1])
return tmp[index]