LeetCode 213.House Robber II 解题分析

题目来源

https://leetcode.com/problems/house-robber-ii/description/

题目描述

Note: This is an extension of House Robber.

After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too much attention. This time, all houses at this place are arranged in acircle. That means the first house is the neighbor of the last one.Meanwhile, the security system for these houses remain the same as for those in the previous street.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

题意分析 

这个题目是另一个题目LeetCode 198.Houser Robber的扩展,相应的解题分析在我的另一篇博客LeetCode 198.House Robber 解题分析中。

大意是一排房子按环状排列,每间房子有一定数量的钱,我们的任务是在不进入相邻房子的前提下得到最多的钱。

题目思路

总体思路是将一个环形DP(Dynamic Programming)问题分解成两个线性DP问题。第一个线性问题,由于房子环状排列,若选择从0号房子开始取钱,那么列表中的最后一个房子则不能进入取钱;第二个线性问题,若选择从1号房子开始取钱,那么0号房子不能进入取钱。取两个结果中的最大值就是全局最大值。

实现代码(Python3)

class Solution:
    def rob(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 1:
            return nums[0]
        return max(self.rob_pre(nums[-1]), self.rob_pre(nums[1:]))
    
    def rob_pre(self, nums):
        if len(nums) == 0:
            return 0
        if len(nums) == 1:
            return nums[0]
        if len(nums) == 2:
            return max(nums)
        nums[1] = max(nums[0], nums[1])
        for i in range(2, len(nums)):
            nums[i] = max(nums[i-2]+nums[i], nums[i-1])
        return nums[-1]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值