第九周作业——高级编程技术

#213

题目来源https://leetcode.com/problems/house-robber-ii/description/

题目分析:这是house-robber的延伸,在上次盗窃完一条街道之后,窃贼又转到了一个新的地方,这个地方的所有房屋都围成一圈。这意味着第一个房子是最后一个是紧挨着的。当然这些房屋的安全系统与上次那条街道的安全系统保持一致。现在给出一份代表每个房屋存放钱数的非负整数列表,确定你可以在不触动警报的情况下盗取的最高金额

题目思路:这是第一版的延伸,问题就是这些房屋构成了一个环状,而不是线状排列。只需考虑下面两种情况: 起点元素作为了加数,终点元素一定就不能作为加数,最大权值和应该等于之前所定义的most[len - 1] 起点元素没有作为加数,则假设去掉这个元素,起点顺移一位,终点元素是否作为加数交由算法自行决定

代码如下:

class Solution(object):

    def rob(self, nums):

        if len(nums) == 0: return 0

        if len(nums) == 1: return nums[0]

        if len(nums) == 2:  

         if nums[0] > nums[1]:

         return nums[0]

         else:

         return nums[1]

        return max(self.robber(nums[0:-1]), self.robber(nums[1:]))

    def robber(self, nums):

        if len(nums) == 1: return nums[0]

        m1 = nums[0]

        if nums[1] > nums[0]:

         m2 = nums[1]

        else:

         m2 = nums[0]

        if len(nums) == 2: return m2

        for i in range(2, len(nums)):

            m3 = max(m2, m1+nums[i])

            m1 = m2

            m2 = m3

        return m3

第九周作业——高级编程技术