39. Combination Sum
class Solution {
public:
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
// write your code here
vector<vector<int>> res;
vector<int> sum;
if(candidates.empty()){
return res;
}
deletesame(candidates);
helper(0, target, candidates, sum, res);
return res;
}
//把所有sum开头的和为target的数字组合都放进res
void helper(int start, int target, vector<int> &candidates,
vector<int> &sum, vector<vector<int>> &res){
if(target == 0){
res.push_back(sum);
return;
}
for(int i=start; i<candidates.size(); i++){
if(candidates[i]>target){
break;
}
sum.push_back(candidates[i]);
helper(i, target-candidates[i], candidates, sum, res);
sum.pop_back();
}
}
void deletesame(vector<int> &candidates){
sort(candidates.begin(), candidates.end());
auto last = unique(candidates.begin(), candidates.end());
candidates.erase(last, candidates.end());
}
};
//me
class Solution {
public:
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
vector<vector<int>> combination;
vector<int> cur;
if(candidates.size()==0)
return combination;
sort(candidates.begin(), candidates.end());
DFS(candidates, target, cur, combination, 0);
return combination;
}
//遍历candidates中的元素,找出所有满足条件的组合
void DFS(vector<int> &candidates, int target, vector<int> &cur, vector<vector<int>> &combination, int begin){
if(target==0){
combination.push_back(cur);
return;
}
else if(target<0)
return;
for(int i=begin; i<candidates.size(); i++){
cur.push_back(candidates[i]);
DFS(candidates, target-candidates[i], cur, combination, i); //本身可重复
cur.pop_back();
}
}
};