题目:
你是一个专业的强盗,计划抢劫沿街的房屋。每间房都藏有一定的现金,阻止你抢劫他们的唯一的制约因素就是相邻的房屋有保安系统连接,如果两间相邻的房屋在同一晚上被闯入,它会自动联系警方。
给定一个代表每个房屋的金额的非负整数列表,确定你可以在没有提醒警方的情况下抢劫的最高金额。
分析:
- 这是一个动态规划问题
- 为满足题目要求,不触碰警报,不能连续两家
- 特例为1)空数组[],输出0; 2) 列表长度为1,输出列表元素A[0]; 3)列表长度大于2,f(n) = max(f(n-1),f(n-2) + A[-1])
- 采用递归
代码:
class Solution(object):
def rob(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if nums:
if len(nums) == 1:
return nums[0]
if len(nums) == 2:
return max(nums)
if len(nums) > 2:
return max(self.rob(nums[:-1]),self.rob(nums[:-2]) + nums[-1])
思考:
- 我的代码使用递归,超时了,但能得到正确结果
- 找到了别人的代码(leetcode tlp108)
class Solution: def rob(self, nums): last, now = 0, 0 for i in nums: last, now = now, max(last + i, now) return now