下面的代码在我的IDE中给出了正确的答案,但是在leetcode输出中给出了错误的答案。
def rob(nums, current=0, memo={}):
if current >= len(nums):
return 0
if current in memo:
sum1 = memo[current]
else:
sum1 = nums[current] + rob(nums, current + 2)
memo[current] = sum1
if current + 1 >= len(nums):
return sum1
if current + 1 in memo:
sum2 = memo[current + 1]
else:
sum2 = nums[current + 1] + rob(nums, current + 3)
memo[current + 1] = sum2
return max(sum1, sum2)投入: 2,7,9,3,1
IDE输出: 12 (正确答案)
leetcode输出:4(错误答案)
为什么会发生这种事?
发布于 2022-06-19 20:16:46
问题在于memo={}。当您只运行一个测试时,它将在本地工作(当您在一个特定的输入上运行它时,它也会在LeetCode上运行),但是当您使用不同的nums输入运行多个函数调用时,您也会得到意想不到的结果。
memo只被分配一次{},并且不会被它重置。此字典只创建一次,该字典将作为下一次调用中的默认值。如果函数改变了该字典,那么下一个调用(不带memo参数)将得到该变异字典作为初始化值。这就是Python中默认参数值的工作方式。
你可以这样解决:
def rob(nums, current=0, memo=None):
if memo is None:
memo = {}
# Rest of your code, but PASS the memo argument!
if current >= len(nums):
return 0
if current in memo:
sum1 = memo[current]
else:
sum1 = nums[current] + rob(nums, current + 2, memo)
memo[current] = sum1
if current + 1 >= len(nums):
return sum1
if current + 1 in memo:
sum2 = memo[current + 1]
else:
sum2 = nums[current + 1] + rob(nums, current + 3, memo)
memo[current + 1] = sum2
return max(sum1, sum2)https://stackoverflow.com/questions/72679931
复制相似问题