213打家劫舍II

题目:你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
链接:https://leetcode-cn.com/problems/house-robber-ii

法一:官方代码

思路:从直线数组变成环状数组最大的区别是首尾数字不能同时取,所以抓住问题的主要矛盾,分两类进行计算,一类是不取第一个数,另一类是不取最后一个数,

class Solution:
    def rob(self, nums: [int]) -> int:
        def my_rob(nums):
            cur, pre = 0, 0
            for num in nums:
                # 右边的第二个cur是到num[i-1]的最大值,所以要赋值给pre,因为下一个循环时cru就是pre了
                cur, pre = max(pre + num, cur), cur
            return cur
        return max(my_rob(nums[:-1]),my_rob(nums[1:])) if len(nums) != 1 else nums[0]
if __name__ == '__main__':
    duixaing = Solution()
    a = duixaing.rob([2,3,2])
    print(a)
View Code

ttt

原文地址:https://www.cnblogs.com/xxswkl/p/12307935.html