注意每层递归都对全体candidates做遍历会导致如[2,2,3],[3,2,2]这样的对称重复的答案的产生。这是因为发生了“往前选择”的情况,我们每次更深层的递归都往后缩小一个candidates,强制函数只能“往后选择”,这将不会出现重复答案。(体现在i的设计上,每次递归find(i, use + [c], remain - c)都是从下标i开始,而不是从下标0开始。也就是下一轮递归起始值是从candidates[i]开始,而不是candidates[0]开始。
代码实现:
classSolution:defcombinationSum(self, candidates: List[int], target:int)-> List[List[int]]:candidates &#61;sorted(candidates)ans &#61;[]deffind(s, use, remain):for i inrange(s,len(candidates)):c &#61; candidates[i]if c &#61;&#61; remain:ans.append(use &#43;[c])if c < remain:find(i, use &#43;[c], remain - c)if c > remain:returnfind(0,[], target)return ans