Leetcode練習(Python):動態規划類:第213題:打家劫舍 II:你是一個專業的小偷,計划偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味着第一個房屋和最后一個房屋是緊挨着的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。


題目:

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

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

思路:

因為首尾兩家相連,因此在一些執行的過程中不應該同時包含首和尾,因此針對不包含首和尾的情況下,分別使用上一題的思路,然后看兩種情況下的最大值即可。一開始是用不包含尾的例子來測,發現有的例子可以通過,有的通不過,並對結果進行了分析,明白了還存在不包含首的情況。

程序:

class Solution:
    def rob(self, nums: List[int]) -> int:
        if not nums:
            return 0
        length = len(nums)
        if length == 1:
            return nums[0]
        if length == 2:
            return max(nums[0], nums[1])
        if length == 3:
            return max(nums[0], nums[1], nums[2])
        candidate1 = self.auxiliaryFunc(nums[0:length - 1])
        candidate2 = self.auxiliaryFunc(nums[1:])
        return max(candidate1, candidate2)
    def auxiliaryFunc(self, nums):
        length = len(nums)
        auxiliary = [-1] * (length + 1)
        auxiliary[0] = 0
        auxiliary[1] = nums[0]
        for index in range(1, length):
            auxiliary[index + 1] = max(auxiliary[index], auxiliary[index - 1] + nums[index])
        return auxiliary[-1]

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM