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