一、题目
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。
说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。
二、思路
回溯(for循环+递归调用)
三、代码
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
res = []
def combination(candidates,target,res_list):
if target < 0:
return
if target == 0:
res.append(res_list)
for i,c in enumerate(candidates):
combination(candidates[i:],target-c,res_list+[c])
combination(candidates,target,[])
return res
四、补充
enumerate()方法:同时返回索引和元素。
if target<0:return #作为递归调用的出口,没有的话报错。
candidates[i:] #从i开始是为了去掉重复的列表,【2,2,3】和【2,3,2】对于这道题来说是相同的,所以为了剪枝,已经遍历过的数不再加入下一次递归。