1. 程式人生 > >【LeetCode】【Python】打家劫舍I

【LeetCode】【Python】打家劫舍I

問題

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

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

示例 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 。

分析

由於問題中講的是不能在相鄰的房間偷竊,那肯定只會存在兩種情況,1.在第一個的房間進行偷竊(偷到第i-1個房間,不能偷第i個房間) 2.在第二個的房間進行偷竊(偷到第i個房間,不能偷第i-1個房間)。那每次就只能在相鄰的兩個房間進行選擇,偷房間1還是偷房間2。由於不知道下一個房間的情況,所以儲存兩個房間的偷竊金額資料,進行比較,選較大的為到目前房間的偷竊資料。

程式碼

class Solution(object):
    def rob(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums)<2:
            return 0 if len(nums)==0 else nums[0]
        last = nums[0]
        cur = max(nums[0],nums[1])
        for i in range(2,len(nums)):
            temp = cur
            cur = max(cur,last+nums[i])
            last = temp
        return cur

借鑑程式碼:https://blog.csdn.net/m0_37477175/article/details/80038517