39. 组合总和
https://leetcode-cn.com/problems/combination-sum/
解法一:回溯
经典回溯。为防止重复先排序,用i遍历candidates[start:],尝试将每个数加入tmplist,因为回头会引起重复,因此递归向后,下一轮start=i。
在递归算法中设置条件,若超过target则返回,等于则将结果写入res,小于则继续添加。
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
self.res = [] #全局结果
tmpList = [] #工作数组
candidates.sort() #先排序
self.backtrack(tmpList, candidates, target, 0)
return self.res
#回溯函数,remain为当前与target的差距,start为候选集中的起始位置
def backtrack(self, tmpList, candidates, remain, start):
if remain < 0: #超了,返回
return
elif remain == 0: #恰好等于,记录结果,并返回
self.res.append(list(tmpList)) #创建一个新的list再写入,否则res会随tmplist改变
return #其实不返回也没事,因为函数到这之后也会退出
else: #还不够,继续递归
for i in range(start, len(candidates)): #从start开始,对每个数遍历
tmpList.append(candidates[i]) #尝试先加入tmplist
#递归,注意最后一个参数不是i+1,因为元素可以重复使用
self.backtrack(tmpList, candidates, remain - candidates[i], i)
tmpList.pop() #不符合则回退回溯可以简化,参考回溯总结
2020.3.25
js:
最后更新于