问题是在排序数组中找到总和为给定目标值的所有唯一组合。在这个例子中,假设候选者=[2,3,6,7] 和目标=7。我看了一些视频,现在我了解了如何解决这个问题的一般算法。我还查看了一个解决方案,但是在可视化函数中的递归树/每个递归调用时遇到了一些麻烦。
var combinationSum = function(candidates, target) {
candidates.sort((a,b) => a-b)
let result = []
combSum(candidates, target, [], result, 0)
return result
};
function combSum(candidates, target, current, result, idx) {
let n
for (let i = idx; i < candidates.length; i++) {
n = candidates[i]
current.push(n)
if (n === target) {
result.push([...current])
} else if (target > n) {
combSum(candidates, target-n, [...current], result, i)
}
current.pop()
}
}
我知道第一步是尝试从数组中的第一个值 2 开始的组合。所以函数将尝试 [2],然后是 [2,2],然后是 [2,2,2],此时目标是小于 n 的 1,因此它跳过 if 语句并弹出最后 2 个。pop() 方法是否隐式返回调用堆栈上的前一个函数调用?它会返回一个从未实际使用过的值 2,这是正确的吗?没有让我失望的基本案例。
另外,我知道由于数组已排序,我们应该知道如果像 [2,2,3,3] 这样的东西不起作用,那么以 [2,2,3] 前缀开头的任何其他组合也将起作用不行。我不明白代码是如何解决这个问题的——它怎么知道“跳过”这些组合?像 [2,2,3,6] 等。
编辑:真的很晚了,我在我原来的帖子中意识到我正在寻找一个不同的目标值,这增加了我的困惑......我修复了我的帖子以反映这一点。对不起!!
HUX布斯
相关分类