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]
]
解题思路:回溯剪枝法,先将candidates排序,之后可以通过比较所需要的值与当前遍历到的值的大小比较,可以剪枝减少运算,当当前遍历到的数大于target直接返回。
C++
class Solution {
public:
vector<int>tempres;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
vector<vector<int>>res;
dfs(candidates, target, 0, res);
return res;
}
void dfs(vector<int>&candidates, int target, int cur, vector<vector<int>>&res){
if(target == 0){
res.push_back(tempres);
return;
}
if(target < candidates[cur])
return;
for(int i = cur; i < candidates.size(); ++ i){
tempres.push_back(candidates[i]);
dfs(candidates, target - candidates[i], i, res);
tempres.pop_back();
}
}
};
Python
class Solution(object):
def combinationSum(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
candidates.sort()
self.res, self.tempres = [], []
def DFS(candidates, target, cur):
if not target:
self.res.append(self.tempres[:])
return
if target < candidates[cur]:
return
for i in range(cur, len(candidates)):
self.tempres.append(candidates[i])
DFS(candidates, target-candidates[i], i)
del self.tempres[-1]
DFS(candidates, target, 0)
return self.res