题目内容
给定一个无重复元素的数组 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的数字可以无限制重复被选取。
https://leetcode-cn.com/problems/combination-sum/
Given a set of candidate numbers (candidates
) (without duplicates) and a target number (target
), find all unique combinations in candidates
where the candidate numbers sums to target
.
The same repeated number may be chosen from candidates
unlimited number of times.
Note:
- All numbers (including
target
) will be positive integers. - The solution set must not contain duplicate combinations.
Example 1:
Input: candidates = [2,3,6,7], target = 7,
A solution set is:
[
[7],
[2,2,3]
]
Example 2:
Input: candidates = [2,3,5], target = 8,
A solution set is:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
题目思路
这道题目也是使用深度优先搜索树DFS进行数组的查找。对于给出的无重复数组,我们按照顺序,已每一个元素为根节点构造树,然后看看是否可以满足要求。对于这棵树来说,它的每一个分支对应的都是数组中的一个元素,但是为了提高效率,需要设置一个start来进行剪枝。在进入下一个分直接点之后,我们要面对三种可能:还没有达到目标数值,继续向下遍历;达到了,加入到结果中;超过,直接返回上一层树。同时,为了提高效率,比如当已经明确最小的叶子结点就已经超过了,同层就不用再算了。可以在三种情况的前面设置一个防止继续再计算的判定。
程序代码
class Solution(object):
def combinationSum(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
nums=sorted(candidates)
res=[]
self.dfs(nums,target,res,[],0)
return res
def dfs(self,nums,target,res,path,start):
if target<0:#超过了
return
if target==0:#刚好符合
res.append(path)
return
for i in range(start,len(nums)):
if i>0:
if target-nums[i-1]<0:#如果上一个就已经超过了,就不用再算了
break
self.dfs(nums,target-nums[i],res,path+[nums[i]],i)