leetcode 39. 组合总和(Combination Sum)
目录
题目描述:
给定一个无重复元素的数组 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的数字可以无限制重复被选取。
说明:
- 所有数字(包括
target
)都是正整数。 - 解集不能包含重复的组合。
示例 1:
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
解法:
class Solution {
public:
vector<vector<int>> getComb(vector<int>& cands, int target, int r){
// cout<<target<<", r="<<r<<endl;
vector<vector<int>> res;
if(r < 0 || target == 0){
return res;
}else{
if(cands[r] < target){
vector<vector<int>> tmp = getComb(cands, target, r-1);
res.insert(res.end(), tmp.begin(), tmp.end());
tmp = getComb(cands, target-cands[r], r);
int len = tmp.size();
for(int i = 0; i < len; i++){
vector<int> lst = tmp[i];
lst.push_back(cands[r]);
res.push_back(lst);
}
}else if(cands[r] == target){
vector<vector<int>> tmp = getComb(cands, target, r-1);
res.insert(res.end(), tmp.begin(), tmp.end());
res.push_back({cands[r]});
}else{
res = getComb(cands, target, r-1);
}
return res;
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<int> cands = candidates;
sort(cands.begin(), cands.end());
// vector<vector<int>> res;
int r = cands.size()-1;
return getComb(cands, target, r);
}
};

更多精彩