leetcode 40. 组合总和 II(Combination Sum II)
目录
题目描述:
给定一个数组 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的每个数字在每个组合中只能使用一次。
说明:
- 所有数字(包括目标数)都是正整数。
- 解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
[1,2,2],
[5]
]
解法:
class Solution {
public:
vector<vector<int>> getComb(vector<int>& cands, int target, int r){
vector<vector<int>> res;
if(r >= 0 && target > 0){
if(cands[r] > target){
res = getComb(cands, target, r-1);
}else if(cands[r] == target){
int _r = r - 1;
while(_r >= 0 && cands[_r] == cands[r]){
_r--;
}
res = getComb(cands, target, _r);
res.push_back({cands[r]});
}else{
int _r = r - 1;
while(_r >= 0 && cands[_r] == cands[r]){
_r--;
}
res = getComb(cands, target, _r);
vector<vector<int>> tmp = getComb(cands, target-cands[r], r-1);
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);
}
}
}
return res;
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<int> cands = candidates;
sort(cands.begin(), cands.end());
int r = cands.size()-1;
return getComb(cands, target, r);
}
};

更多精彩