题目大意:给定一个数组candidates和一个数target,求一个不同的集合,集合里面的每个数来自于candidates,它们的和为target
解题思路:递归。先对candidates从大到小排序,遍历每个元素做递归,遍历到当前元素有两种选择,
第一种,选取这个数,然后继续在这个位置进行递归
第二种,不选取这个数,在这个数后面的位置进行递归
class Solution {
public:
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
vector<vector<int> > result;
vector<int> combination;
if(!candidates.empty()) {
sort(candidates.begin(), candidates.end());
combinationSumAssist(candidates, 0, target, result, combination);
}
return result;
}
private:
void combinationSumAssist(vector<int> &candidates, int index, int target, vector<vector<int> > &result, vector<int> &combination) {
if(index >= candidates.size()) {
return;
}
int temp = target - candidates[index];
if(temp >= 0) {
combination.push_back(candidates[index]);
if(temp == 0) {
result.push_back(combination);
} else {
combinationSumAssist(candidates, index, temp, result, combination);
}
combination.pop_back();
}
combinationSumAssist(candidates, index + 1, target, result, combination);
}
};