You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现LeetCode HouseRobber代码结果错误如何解决

问题描述

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,相邻房屋装有连通的防盗系统,若同一晚闯入两间相邻的房屋,系统会自动报警。
给定代表每间房屋存放金额的整数数组nums,请返回不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。

原有代码缺陷定位

给出的原有实现存在3个核心问题,导致用例[1,3,1,3,100]运行结果错误:

  • 状态转移逻辑完全错误:计算第i间房的最大偷窃收益时,仅考虑了当前房和i-2位置、第0位的金额累加,没有传递更早位置的最优解。在该测试用例中,遍历到最后一间房(金额100,索引4)时,代码只取了被修改过的nums[2](值为2,对应偷第0、2间的收益)加100得到102,完全漏掉了「偷第1间(3)+第4间(100)=103」的最优组合。
  • 存在永远不会执行的死代码:判断分支if i == len(nums)永远无法触发,因为range(2, len(nums))生成的索引最大值为len(nums)-1,该分支下的逻辑完全无效。
  • 无意义的边界绑定:逻辑中强行计算当前房和第0间的金额和,既没有考虑不偷第0间能拿到更高收益的场景,也没有覆盖隔多间房的合法组合。
正确实现方案

该问题是经典的动态规划入门题,不需要修改原数组,仅用两个变量滚动维护偷到前两个位置的最大收益即可,时间复杂度O(n),空间复杂度O(1):

class Solution(object):
    def rob(self, nums):
        if len(nums) == 1:
            return nums[0]
        # pre2: 偷到上上间房的最大收益,pre1: 偷到上一间房的最大收益
        pre2, pre1 = nums[0], max(nums[0], nums[1])
        for i in range(2, len(nums)):
            # 当前位置最大收益 = max(不偷当前房取上一间收益, 偷当前房加上上间收益)
            cur = max(pre1, pre2 + nums[i])
            pre2, pre1 = pre1, cur
        return pre1

针对测试用例[1,3,1,3,100]的计算流程验证:

  1. 初始状态:pre2=1(偷第0间收益),pre1=3(偷前两间最大收益)
  2. 遍历到第2间(金额1):当前最大收益为max(3, 1+1=2)=3,滚动更新pre2=3,pre1=3
  3. 遍历到第3间(金额3):当前最大收益为max(3, 3+3=6)=6,滚动更新pre2=3,pre1=6
  4. 遍历到第4间(金额100):当前最大收益为max(6, 3+100=103)=103,最终返回结果符合预期。

内容的提问来源于stack exchange,提问作者Ben Zhao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:42:17