1. 程式人生 > >Leetcode 213:打家劫舍 II(最詳細的解法!!!)

Leetcode 213:打家劫舍 II(最詳細的解法!!!)

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

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

示例 1:

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

示例 2:

輸入: [1,2,3,1]
輸出: 4
解釋: 你可以先偷竊 1 號房屋(金額 = 1),然後偷竊 3 號房屋(金額 = 3)。
     偷竊到的最高金額 = 1 + 3 = 4 。

解題思路

這和問題和之前Leetcode 198:打家劫舍(最詳細的解法!!!) 問題思路一樣,不過這裡多了一些考量。因為這裡的房子成環,所以最大值出現的情況無非兩種。

  • nums[1:]中存在最大值
  • nums[:-1]中存在最大值

也就是上述兩者情況之一。

class Solution:
    def rob(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return 0
        
        if
len(nums) == 1: return nums[0] pre1, cur1, pre2, cur2 = 0, 0, 0, 0 for i in nums[:-1]: pre1, cur1 = cur1, max(pre1 + i, cur1) for i in nums[1:]: pre2, cur2 = cur2, max(pre2 + i, cur2) return max(cur1, cur2)

程式碼沒有變化,所以我們直接使用之前的程式碼即可。

如有問題,希望大家指出!!!