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]的计算流程验证:
- 初始状态:
pre2=1(偷第0间收益),pre1=3(偷前两间最大收益) - 遍历到第2间(金额1):当前最大收益为
max(3, 1+1=2)=3,滚动更新pre2=3,pre1=3 - 遍历到第3间(金额3):当前最大收益为
max(3, 3+3=6)=6,滚动更新pre2=3,pre1=6 - 遍历到第4间(金额100):当前最大收益为
max(6, 3+100=103)=103,最终返回结果符合预期。
内容的提问来源于stack exchange,提问作者Ben Zhao
相关产品推荐
相关产品推荐

