给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
思路:回溯法
模板一:
class Solution(object):
def combinationSum(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
# 回溯 DFS 要返回集合,只能用回溯 若返回可能数,直接dp
self.res=[]
candidates.sort()
self.dfs(candidates,0,0,[],target)
def dfs(self,candidates,i,tmp_sum,nums,target):
'''
回溯
'''
if tmp_sum>target or i>=len(candidates):return
if tmp_sum==target :
self.res.append(nums[:])
return
for j in range(i,len(candidates)):
if tmp_sum+candidates[j]>target:
break
nums.append(candidates[j])
self.dfs(candidates,j,tmp_sum+candidates[j],nums,target)
# 递归下一步后,回溯
nums.pop()
模板二:
class Solution(object):
def combinationSum(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
# 回溯 DFS 要返回集合,只能用回溯 若返回可能数,直接dp
self.res=[]
candidates.sort()
self.dfs(candidates,0,0,[],target)
return self.res
法一:dfs
def dfs(self,candidates,i,tmp_sum,nums,target):
'''
回溯
'''
if tmp_sum>target or i>=len(candidates):return
if tmp_sum==target :
self.res.append(nums[:])
return
nums.append(candidates[i])
self.dfs(candidates,i,tmp_sum+candidates[i],nums,target)
# 找到解或者没找到解 回溯 从下一个位置开始搜索
nums.pop()
self.dfs(candidates,i+1,tmp_sum,nums,target)