python - Leetcode #377 组合总和 IV,我的代码中的意外行为
问题描述
我正在做这个问题,发现于: https ://leetcode.com/problems/combination-sum-iv/
这是我的代码:
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
length = len(nums)
count = 0
tracker = []
result = []
def backtrack(targetLeft: int) -> None:
nonlocal count
if targetLeft == 0:
print(tracker)
result.append(tracker)
count += 1
return
elif targetLeft > 0:
for number in nums:
if targetLeft - number < 0:
continue
tracker.append(number)
backtrack(targetLeft - number)
tracker.pop()
return
backtrack(target)
print(result)
return count
在理解我的代码的过程中,我试图打印出导致目标总和的组合列表。我还在最后打印结果数组,其中存储了所有组合。运行代码时,这是标准输出:
[1, 1, 1, 1]
[1, 1, 2]
[1, 2, 1]
[1, 3]
[2, 1, 1]
[2, 2]
[3, 1]
[[], [], [], [], [], [], []]
它似乎生成了正确的组合,但是这些组合没有正确地附加到结果数组中。结果数组返回到一个空数组数组。我尝试手动浏览代码,但我不太确定导致这种情况发生的原因。
解决方案
这个问题有一个简单的线性解 O(N),其中 N -- 是你想要达到的总和。关键是,您不必生成所有组合来计算它们。
- 计算达到 N=1 的方法有多少(答案:1,因为很明显)
- 计算达到 N=2 的方法有多少(答案:2,一种来自 N=1,一种来自 0 pos)
- 数一下有多少种方法可以达到 N=3、4、5、6 等等,根据你之前的结果,基本上总结了 N-1、N-2 和所有这些数字的结果。
- 利润!
推荐阅读
- javascript - 在启动时获取数据
- javascript - 如果单元格等于我的查询,如何从 html 表中获取一行?
- sas - 如何使用宏将名称中带有日期的多个文件读入SAS
- python - DataFrame对象类型列到int或float错误
- android - 如何从特定片段中的活动中禁用 onDestroy 方法?
- javascript - 使用for循环在一个字符串中插入多个字符串
- orientdb - OrientDB 查询适用于 Studio,但不适用于 PyOrient
- javascript - 如何正确等待这个 axios.get 请求?
- c# - 是否有任何简单的方法可以将复杂对象从一个 PageModel 文件传递到 asp.net 核心剃须刀页面(mvvm,而不是 mvc)中的另一个?
- stripe-payments - 在 Laravel Cashier 中处理新的 PaymentIntent 的最佳方法是什么