想到了回溯,但是具体不知道怎么写,看参考链接回溯算法 + 剪枝(回溯经典例题详解)。
- 回溯/DFS
- 去重
这句话点醒了我,原篇写的真好。
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
# 所有的组合->想到回溯,不同组合->去重(因为每次dfs就会列出包含该元素的所有结果,所以在二叉树同层的右边直接就不要考虑前面dfs过的数了)
# 参考链接中说《三数之和》也是这样去重的,之前是通过排序+双指针做的,而这个左边的指针就是从当前索引开始的,而不是0。这样去重的。
self.clen = len(candidates)
self.res = []
self.candidates = candidates
def backtrack(combination, target, pivot):
if target == 0:
self.res.append(combination)
return
if target < 0: return
for i in range(pivot, self.clen):
backtrack(combination+[self.candidates[i]], target-self.candidates[i],i)
backtrack([], target, 0)
return self.res