一、用list保存去重后的元素,map记录每个元素最多使用几次
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
int sum = 0;
map<int, int> mp;
// 回溯
void doBack(int target, vector<int> &candidates, int startIndex){
if(sum == target){
result.push_back(path);
return;
}
if(sum > target){
return;
}
for(int i = startIndex; i < candidates.size(); i++){
if(mp[candidates[i]] > 1){
path.push_back(candidates[i]);
sum += candidates[i];
mp[candidates[i]]--;
doBack(target, candidates, i);
path.pop_back();
sum -= candidates[i];
mp[candidates[i]]++;
}
else{
path.push_back(candidates[i]);
sum += candidates[i];
mp[candidates[i]]--;
doBack(target, candidates, i + 1);
path.pop_back();
sum -= candidates[i];
mp[candidates[i]]++;
}
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
// 先排序
vector<int> list;
for(int i = 0; i < candidates.size(); i++){
mp[candidates[i]]++;
if(mp[candidates[i]] == 1) list.push_back(candidates[i]);
}
// for(int i = 0; i < candidates.size(); i++){
// if(i != 0 && candidates[i] == candidates[i - 1]) continue;
// path.push_back(candidates[i]);
// sum += candidates[i];
// doBack(target, candidates, i + 1);
// path.pop_back();
// sum -= candidates[i];
// // printf("%d\n", i);
// }
// sort(list.begin(), list.end());
doBack(target, list, 0);
return result;
}
};
二、先排序,再去重
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
int sum = 0;
// 回溯
void doBack(int target, vector<int> &candidates, int startIndex){
if(sum == target){
result.push_back(path);
return;
}
if(sum > target){
return;
}
for(int i = startIndex; i < candidates.size(); i++){
if(i > startIndex && candidates[i] == candidates[i - 1]) continue;
path.push_back(candidates[i]);
sum += candidates[i];
doBack(target, candidates, i + 1);
path.pop_back();
sum -= candidates[i];
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
// 先排序
sort(candidates.begin(), candidates.end());
doBack(target, candidates, 0);
return result;
}
};