LC 213动态规划中等第 79 / 95 题

打家劫舍 II

House Robber II

动态规划环形拆解
本机进度仅保存在当前浏览器

题目描述

这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。给定一个代表每个房屋存放金额的非负整数数组,计算在不触动警报装置的情况下,今晚能够偷窃到的最高金额。

示例:nums = [2, 3, 2],输出 3(首尾不能同时偷,只能偷 3)。

解题思路

  1. 环形约束的本质:首尾两间不能同时偷。拆成两个线性子问题即可。
  2. 子问题一:偷 [0, n-2](不含尾);子问题二:偷 [1, n-1](不含首),各自用第 198 题解法。
  3. 答案取两子问题较大值;单间房屋与空输入要单独处理。

参考实现

查看参考实现Python · 建议先自行作答
def rob(nums):
    def rob_line(houses):
        prev = cur = 0
        for x in houses:
            prev, cur = cur, max(cur, prev + x)
        return cur

    if len(nums) == 1:
        return nums[0]
    # 首尾不相容,拆成两条线性链取较大
    return max(rob_line(nums[:-1]), rob_line(nums[1:]))

复杂度与归属

时间复杂度O(n)
空间复杂度O(1)
所属分类动态规划
题源LeetCode 213

关联教程

返回题图鉴