1 回答

TA贡献1876条经验 获得超6个赞
该答案并未涉及可视化方面,而是仅限于您对特定细节的问题。
预赛
递归基于这样的思想,即在对目标求和的组合的增量构造中的任何一步,都需要针对原始目标与使用相同集合的当前部分组合之和的差异来解决原始问题的候选人。
combSum
携带的参数含义如下:
candidates
:要从中挑选的数字池(有序数组)target
: 要组合的数字(整数)current
: 当前正在完成的部分组合(有序数组)result
:到目前为止发现的组合
(伪字典序排列的数组 - 前缀在它们的延续之后)idx
:candidates
要在调用中使用的元素的最小索引。
在概念上candidates
并idx
折叠成单个实参candidates.slice(i)
。
递归中有2个不变量:
current
表示当前完成的部分构造组合的数组中的元素是非递减的。该序列是从左到右构建的。
特别是,没有递归调用会更改current
调用时存在的元素。
候选的排序有助于避免相同序列的重复构造。请记住,在每次递归调用的有效候选元素是candidates.slice(i)
与i
非递减,并在每个递归级别的循环,这个层次的i
起始值开始与当前值i
从父级。
请注意,这仅candidates
在结果组合中没有出现重复数字时才有效,否则以该数字开头的子序列将被多次计算产生几个相同的结果( TrycombinationSum([1,4], 4)
和combinationSum([1,1,4], 4)
; 准确地说,如果多重性incandidates
将等于每个结果的多重性......尝试combinationSum([2,2,5], 9)
和combinationSum([2,5], 9)
)
1.递归基
递归基是这样的n >= target
...
2. 跳过'不可能'前缀 ...如果n === target
,当前部分组合完成并添加到结果中。如果n > target
当前的部分组合不能成功完成(候选数字只会变大,当前的已经太大了)。但是,代码不适合这种情况(它可以if (n > target) break;
在循环结束时使用语句)。
3.隐式返回 current.pop()
恢复combSum
started的当前调用的部分组合。这是它的目的。虽然技术上pop
返回了一些值,但是这个值已经被使用了——它是current
递归调用站点的顶部元素!
添加回答
举报