題目:
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
示例 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 。
我的解答:
思路是,計算奇偶和,看誰大。錯誤在於不一定按連續奇偶來取值。
class solution(object):
def rob(self, nums):
""":type nums: list[int]
:rtype: int
"""a = 0
b = 0
i = 0
while i < len(nums) - 1:
a = a + nums[i]
b = b + nums[i+1]
i = i + 2
if i == len(nums) - 1:
a = a + nums[-1]
return max(a,b)
考慮使用動態規劃。dp[i]表示從0-i戶可以打劫到的最大錢數。則有dp[i] = max(dp[i-1],dp[i-2]+nums[i])。第(i-1)戶打劫到的最大錢數+不打劫第i戶,與第(i- 2)戶打劫的最大錢數+打劫第i戶,兩者中的最大值。
class solution(object):
def rob(self, nums):
""":type nums: list[int]
:rtype: int
"""if nums==:
return 0
if len(nums)==1:
return max(nums)
dp = [0]*len(nums)
dp[0] = nums[0]
dp[1] = max(nums[1],nums[0])
for i in range(2,len(nums)):
dp[i] = max(dp[i-1],dp[i-2]+nums[i])
return dp[len(nums)-1]
刷題小記198 數數
描述 我們平時數數都是喜歡從左向右數的,但是我們的小白同學最近聽說德國人數數和我們有些不同,他們正好和我們相反,是從右向左數的。因此當他看到123時會說 321 現在有一位德國來的教授在鄭州大學進行關於acm的講座。現在他聘請你來擔任他的助理,他給你一些資料讓你找到這些資料在書中的頁數。現在你已經找...
leetcode第198題打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你 不觸動警報裝置的情況下 一夜之內能夠偷竊到的最高金額。示例 1 ...
Leetcode刷題之括號
給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true 示例 2 輸入 輸出 true 示例 3 輸入 輸出 false 示例 4 輸入 輸出 false 示例 5 輸入 輸...