题目
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[ [7],[2,2,3]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法
看起来很复杂,使用递归总体思想很简单:
- 要选择第一个元素, 这个元素仍然可以重复多次选择:combinationSum(candidates[0:], target-candidates[0])
- 不选择第一个元素, 由于没有重复的元素,这个元素不会再被选择了:
combinationSum(candidates[1:], target)
上面的每种情况又分别包含了选择第二个元素和不选第二个元素的情况, 依次递归.
停止条件:
- target 为0, 和清除掉符合要求的元素以及大于target的元素之后,candidate为空了.
2.记录下刚好等于target的结果,为成功搜索.
代码
class Solution(object):
def combinationSum(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
if target<=0 or len(candidates)==0:
return []
res = []
for i in candidates[: : -1]:
# 某一个元素和target 相等了
if i==target:
res.append([i])
candidates.remove(i)
# 清除大于target的元素
elif i>target:
candidates.remove(i)
# 当candidate中已经没有元素的时候
if len(candidates)==0:
return res
# 某次选择一个元素或者不选
# 选当前元素
tmp = self.combinationSum(candidates[0:], target-candidates[0])
for j in tmp:
res.append([candidates[0]]+j)
tmp1 = self.combinationSum(candidates[1:], target)
for j in tmp1:
res.append(j)
return res