题目
链接https://leetcode.cn/problems/combination-sum/
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以无限制重复被选取。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
思路
回溯法,退出条件为每次回溯(调用自身函数)时,判断参数target是否小于等于0,如等于0,加入结果,如小于0,则返回上一层,如大于0,则需要再次寻找符合条件的path,回溯递归树画出来即可。
代码
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
self.ans = []
path = []
def dfs(begin,target,path):
if target < 0:
return # 不符合
if target == 0:
self.ans.append(path) # 保存
return
for i in range(begin,len(candidates)):
dfs(i,target-candidates[i],path+[candidates[i]])
dfs(0,target,path)
return self.ans