题目描述
解题思路
解法一:回溯法
比如:candidates = [2,3,6,7],target = 7
- 找到全是2的组合是否能组成7,如果7-2-2-2!=0,则跳出循环,寻找2和下一个数的组合
- 7-2-2-3=0,则接着找7-2-3之后列表中是否有满足的,由于列表进行了排序,发现7-2-3-2!=0,第一个数2不行就直接跳出,后面的3,6,7就不用再验证
- 找到全为3的组合是否能组成7,此时直接从下标为1的数开始找,避免找到重复的组合,7-3-3-3!=0,跳出循环,7-3-6!=0,跳出循环
- 找到全为6的组合是否能组成7,此时从下标为2的数开始找,7-6-6!=0,跳出循环
- 找到全为7的组合是否能组成7,从下标为3的数开始找,7-7=0
- 结束,存储满足的组合
python代码
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
size = len(candidates)
if size == 0:
return []
candidates.sort()
path = []
res = []
self.__dfs(candidates, 0, size, path, res, target)
return res
def __dfs(self,candidates, begin, end, path, res, target):
if target == 0:
res.append(path[:])
return
for i in range(begin,end):
residue = target - candidates[i]
if residue < 0:
return
path.append(candidates[i])
self.__dfs(candidates, i, end, path, res, residue)
path.pop()