題目:
打家劫舍 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]