描述
在上次打劫完一條街道之後,竊賊又發現了乙個新的可以打劫的地方,但這次所有的房子圍成了乙個圈,這就意味著第一間房子和最後一間房子是挨著的。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是:相鄰的房子裝著相互聯絡的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動報警。
給定乙個非負整數列表,表示每個房子中存放的錢, 算一算,如果今晚去打劫,在不觸動報警裝置的情況下, 你最多可以得到多少錢 。
這題是house robber的擴充套件,只不過是由直線變成了圈
您在真實的面試中是否遇到過這個題?
樣例樣例1
輸入: nums = [3,6,4]
輸出: 6
樣例2輸入: nums = [2,3,2,3]
輸出: 6
思路:動態規劃求解
(1)不考慮第一間房子和最後一間房子是挨著的時
考慮前i項的結果dp[i]時,
dp[i]為到達第i個房間時,得到的最大收益,a為房間錢陣列。
當i = 1, 返回dp[0] = a[0]
當i = 2, 返回dp[1] = max(a[0], a[1])
當i = 3, 分為偷3號房屋和不偷3號房屋,
偷的情況下, 2號房間就不能偷了,結果為a[2] + dp[0]
不偷的情況下,結果為dp[1]
所以返回dp[2] = max(dp[0] + a[2], dp[1])
以此類推,dp[i] = max(dp[i-2] + a[i], dp[i-1])
(2)考慮第一間房子和最後一間房子是挨著時
區別在於1號房屋和最後一號房屋只能二選一
即把1號房間捨棄,或者最後一號房間捨棄。在這兩種情況下選最優。
class
solution
:"""
@param nums: an array of non-negative integers.
@return: the maximum amount of money you can rob tonight
"""defhouserobber
(self, nums)
:# write your code here
iflen
(nums)==1
:return nums[0]
return
max(self.houserobber2(nums[1:
]), self.houserobber2(nums[:-
1]))
defhouserobber2
(self, nums):if
len(nums)==0
:return
0 dp =[0
for _ in nums]
dp[0]
= nums[0]
for i in
range(1
,len
(nums)):
if i ==1:
dp[i]
=max
(nums[0]
, nums[i]
)else
: dp[i]
=max
(dp[i -2]
+ nums[i]
, dp[i -1]
)return dp[-1
]c=solution(
)d=c.houserobber([2
,3,2
,3])
print
(d)
結果:6 LintCode 534 打劫房屋 II
在上次打劫完一條街道之後,竊賊又發現了乙個新的可以打劫的地方,但這次所有的房子圍成了乙個圈,這就意味著第一間房子和最後一間房子是挨著的。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是 相鄰的房子裝著相互聯絡的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動報警。給定乙個非負整數列表,...
LintCode 535 打劫房屋 III
在上次打劫完一條街道之後和一圈房屋之後,竊賊又發現了乙個新的可以打劫的地方,但這次所有的房子組成的區域比較奇怪,聰明的竊賊考察地形之後,發現這次的地形是一顆二叉樹。與前兩次偷竊相似的是每個房子都存放著特定金額的錢。你面臨的唯一約束條件是 相鄰的房子裝著相互聯絡的防盜系統,且當相鄰的兩個房子同一天被打...
LeetCode 198 打家劫舍
題目 你是乙個專業的強盜,計畫搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡 給定乙個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒 的情況下搶劫的最高金額。思路 本題的大致意思就是求取乙個...