198.打家劫舍
题目表述:
你是一个专业的强盗,计划抢劫沿街的房屋。每间房都藏有一定的现金,阻止你抢劫他们的唯一的制约因素就是相邻的房屋有保安系统连接,如果两间相邻的房屋在同一晚上被闯入,它会自动联系警方。
给定一个代表每个房屋的金额的非负整数列表,确定你可以在没有提醒警方的情况下抢劫的最高金额。
PYTHON:
class Solution(object):
def rob(self, nums):
""" :type nums: List[int] :rtype: int """
n = len(nums)
ll = [0 for i in range(n)]
if n == 0:
return 0
if n == 1:
return nums[0]
if n == 2:
return max(nums)
else:
ll[0] = nums[0]
ll[1] = max(nums[0],nums[1])
for i in range(2,len(nums)):
ll[i] = max(ll[i-2] + nums[i],ll[i-1])
return ll[n-1]
- 打家劫舍 II
题目描述:
在上次盗窃完一条街道之后,窃贼又转到了一个新的地方,这样他就不会引起太多注意。这一次,这个地方的所有房屋都围成一圈。这意味着第一个房子是最后一个是紧挨着的。同时,这些房屋的安全系统与上次那条街道的安全系统保持一致。
给出一份代表每个房屋存放钱数的非负整数列表,确定你可以在不触动警报的情况下盗取的最高金额。
PYTHON:
class Solution(object):
def rob(self, nums):
""" :type nums: List[int] :rtype: int """
n = len(nums)
out1 = [0 for x in range(n)]
out2 = [0 for x in range(n)]
if n == 0:
return 0
if n == 1 :
return nums[0]
if n == 2 :
return max(nums[0],nums[1])
else:
out1[0] = nums[0]
out2[1] = nums[1]
out1[1] = max(nums[0],nums[1])
out2[2] = max(nums[1],nums[2])
for i in range(2,n-1):
out1[i] = max(out1[i-2] + nums[i],out1[i-1])
out2[i+1] = max(out2[i-1] + nums[i+1],out2[i])
return max(out1[n-2],out2[n-1])
思路:因为房子是环形的,所以不能在打劫了第一座房子之后还打劫第二座房子,所以说分两种情况分别计算:1,不打劫第一座房子;2,不打劫最后一座房子,取最大即可。