class Solution {
public:
vector<int> tmp;
vector<vector<int>> res;
vector<pair<int, int>> freq;
int sz;
void dfs(int target, int pos, int sum){
if(sum == target){
res.push_back(tmp);
return;
}
//到末尾还没到target或者后续的freq已经大于剩余
if(pos == freq.size() || freq[pos].first > target - sum) return;
//不取该位置
dfs(target, pos + 1, sum);
for(int i = 1; i <= freq[pos].second; i++){
tmp.push_back(freq[pos].first);
dfs(target, pos + 1, sum + i * freq[pos].first);
}
//把当前pos的freq.first都弹出
for(int i = 1; i <= freq[pos].second; ++i) {
tmp.pop_back();
}
}
//为了使找到的组合数都不重复,将candidates排序,然后用vector<pair>记录每个元素出现
//的频次n,在深搜vector,每个位置搜索1....n次,这个就能保证最后的组合数不重复
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sz = candidates.size();
sort(candidates.begin(), candidates.end());
for(int i = 0; i < sz; i++){
if(freq.empty() || candidates[i] != freq.back().first){
freq.push_back(pair<int, int>(candidates[i], 1));
}
else{
freq.back().second++;
}
}
dfs(target, 0, 0);
return res;
}
};
leetcode 40.组合总和2 (dfs + 减枝)
于 2023-03-10 10:38:34 首次发布