首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Leetcode House Robber custom与自定义测试案例

Leetcode House Robber custom与自定义测试案例
EN

Stack Overflow用户
提问于 2021-07-21 14:30:46
回答 2查看 267关注 0票数 1

我正在研究198.屋贼 LeetCode问题:

你是一个职业抢劫犯,打算抢劫街道上的房屋。每间房子都藏着一定数量的钱,阻止你抢劫每栋房子的唯一限制是相邻的房子都有安全系统连接,如果相邻的两栋房子在同一个晚上被闯入,会自动联系警察。 给定一个整数数组nums,表示每所房子的钱数,返回你今晚可以抢劫的最大金额,没有通知警方。 示例1: 投入: nums = 1,2,3,1产出:4 解释:抢劫房屋1(货币= 1),然后抢劫房屋3(货币= 3)。 你可以抢劫的总数=1+3= 4。 示例2: 投入: nums = 2,7,9,3,1产出: 12 解释:抢劫房屋1(货币= 2),抢劫房屋3(货币= 9),抢劫房屋5(货币= 1)。 你可以抢劫的总数=2+9+1= 12。

我的代码

代码语言:javascript
复制
class Solution:
    def rob(self, nums, n=0, memo={}):
        if n in memo:
            return memo[n]
        
        if n == len(nums) - 1:
            return nums[n]
        if n > len(nums) - 1:
            return 0
        
        f = nums[n] + self.rob(nums, n + 2)
        s = nums[n + 1] + self.rob(nums, n + 3)
        
        memo[n] = max(f, s)

        return max(f, s)

当我单击submit按钮时,输入:[2,7,9,3,1]会失败。但是,当我把它作为一个自定义测试用例运行时,它似乎起作用了:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-21 14:41:16

问题在于memo参数。

由于它是定义的(memo={}),它永远不会在测试用例之间重置,因此它将携带与当前测试用例无关的值。

与其他语言不同的是,参数的默认值仅在函数定义时计算,而不是在执行时计算。

因此,请确保将memo定义为函数中的局部变量,而不是参数。

您可以在rob中作为嵌套函数创建递归函数,以便在递归期间访问相同的memo实例。

因此,将您的代码更改为:

代码语言:javascript
复制
def rob(self, nums):
    memo = {}  # define here so it gets reset at every call
    
    def recur(n):  # recursive function with access to memo
        if n in memo:
            return memo[n]

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

        f = nums[n] + recur(n + 2)
        s = nums[n + 1] + recur(n + 3)

        memo[n] = max(f, s)

        return max(f, s)
    
    return recur(0)
票数 3
EN

Stack Overflow用户

发布于 2022-06-27 12:16:10

下面是我不断更新元素并根据规则找到最大和的代码:

代码语言:javascript
复制
class Solution:
    def rob(self, nums):
        if len(nums) == 1:
            return nums[0]

        elif len(nums) == 2:
            return max(nums[0], nums[1])

        else:
            robFirst = nums[0]
            robSecond = max(nums[0], nums[1])

            for i in range(2, len(nums)):
                current = max(robSecond, robFirst + nums[i])

                robFirst = robSecond
                robSecond = current

        return robSecond
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68471398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档