【Leetcode】打家劫舍 I and 打家劫舍 II(动态规划)PYTHON

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]

  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,不打劫最后一座房子,取最大即可。

你可能感兴趣的:(LeetCode,python学习手册)