leetcode 打家劫舍

2021-09-29 06:45:44 字數 2883 閱讀 4580

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。

示例 1:

輸入: [1,2,3,1]

輸出: 4

解釋: 偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)。

偷竊到的最高金額 = 1 + 3 = 4 。

示例 2:

輸入: [2,7,9,3,1]

輸出: 12

解釋: 偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接著偷竊 5 號房屋 (金額 = 1)。

偷竊到的最高金額 = 2 + 9 + 1 = 12 。

解題:標籤:動態規劃

動態規劃方程:dp[n] = max( dp[n-1], dp[n-2] + num )

由於不可以在相鄰的房屋闖入,所以在當前位置 n 房屋可盜竊的最大值,要麼就是 n-1 房屋可盜竊的最大值,要麼就是 n-2 房屋可盜竊的最大值加上當前房屋的值,二者之間取最大值

舉例來說:1 號房間可盜竊最大值為 33 即為 dp[1]=3,2 號房間可盜竊最大值為 44 即為 dp[2]=4,3 號房間自身的值為 22 即為 num=2,那麼 dp[3] = max( dp[2], dp[1] + num ) = max(4, 3+2) = 5,3 號房間可盜竊最大值為 55

時間複雜度:o(n)o(n),nn 為陣列長度

# -*- coding: utf-8 -*-

class solution(object):

def rob(self,nums):

curmax = 0;

premax = 0;

for i in nums:

tmp = curmax

curmax = max(premax + i,curmax)

premax = tmp

return curmax

if __name__ == "__main__":

s = solution()

nums = list(map(int,input().split()))

print(s.rob(nums))

你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。

示例 1:

輸入: [2,3,2]

輸出: 3

解釋: 你不能先偷竊 1 號房屋(金額 = 2),然後偷竊 3 號房屋(金額 = 2), 因為他們是相鄰的。

示例 2:

輸入: [1,2,3,1]

輸出: 4

解釋: 你可以先偷竊 1 號房屋(金額 = 1),然後偷竊 3 號房屋(金額 = 3)。

偷竊到的最高金額 = 1 + 3 = 4 。

解題:陣列是個環,也就是說偷第一家,最後一家就不能偷;偷最後一家,第一家就不能偷。

所以,我們問題分成求 nums[0:n - 1]或者 nums[1:n]

就變成了198. 打家劫舍 

# -*- coding: utf-8 -*-

class solution(object):

def rob(self,nums):

if not nums:

return 0

if len(nums)==1:

return nums[0]

curmax1 = 0;

premax1 = 0;

for i in nums[0:len(nums)-1]:

tmp = curmax1

curmax1 = max(premax1 + i,curmax1)

premax1 = tmp

curmax2 = 0;

premax2 = 0;

for i in nums[1:]:

tmp = curmax2

curmax2 = max(premax2 + i,curmax2)

premax2 = tmp

return max(curmax1,curmax2)

if __name__ == "__main__":

s = solution()

nums = list(map(int,input().split()))

print(s.rob(nums))

在上次打劫完一條街道之後和一圈房屋後,小偷又發現了乙個新的可行竊的地區。這個地區只有乙個入口,我們稱之為「根」。 除了「根」之外,每棟房子有且只有乙個「父「房子與之相連。一番偵察之後,聰明的小偷意識到「這個地方的所有房屋的排列類似於一棵二叉樹」。 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。

計算在不觸動警報的情況下,小偷一晚能夠盜取的最高金額。

示例 1:

輸入: [3,2,3,null,3,null,1]

3/ \

2   3

\   \ 

3   1

輸出: 7 

解釋: 小偷一晚能夠盜取的最高金額 = 3 + 3 + 1 = 7.

示例 2:

輸入: [3,4,5,1,3,null,1]

3/ \

4   5

/ \   \ 

1   3   1

輸出: 9

解釋: 小偷一晚能夠盜取的最高金額 = 4 + 5 = 9.

LeetCode 打家劫舍

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...

leetcode 打家劫舍

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...

leetcode 打家劫舍

動態規劃 dp i 表示到第i個房屋的偷竊最高金額。顯然,遞推公式為 dp i max dp i 2 nums i 1 dp i 1 含義為,當前房屋的最高金額為前前個房屋的最高金額加上當前房屋的財富和上乙個房屋的最高偷竊金額中的最大值 1 特判,若陣列為空,返回0 2 初始化dp 0,0 為n 1...