Leetcode 534打劫房屋II python

2021-10-07 01:26:21 字數 1830 閱讀 4056

描述

在上次打劫完一條街道之後,竊賊又發現了乙個新的可以打劫的地方,但這次所有的房子圍成了乙個圈,這就意味著第一間房子和最後一間房子是挨著的。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是:相鄰的房子裝著相互聯絡的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動報警。

給定乙個非負整數列表,表示每個房子中存放的錢, 算一算,如果今晚去打劫,在不觸動報警裝置的情況下, 你最多可以得到多少錢 。

這題是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 打家劫舍

題目 你是乙個專業的強盜,計畫搶劫沿街的房屋。每間房都藏有一定的現金,阻止你搶劫他們的唯一的制約因素就是相鄰的房屋有保安系統連線,如果兩間相鄰的房屋在同一晚上被闖入,它會自動聯絡 給定乙個代表每個房屋的金額的非負整數列表,確定你可以在沒有提醒 的情況下搶劫的最高金額。思路 本題的大致意思就是求取乙個...