给定一个候选人编号的集合 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8, 输出: [ [1,1,6], [1,2,5], [1,7], [2,6] ]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5, 输出: [ [1,2,2], [5] ]
我的解:
和上一题大同小异,在上一题的基础上我们可以考虑将相同的数放在一起进行处理。
class Solution {
private:
vector<pair<int,int>>freq;
vector<vector<int>>ans;
vector<int>sequence;
public:
void dfs(int pos,int rest){
if(rest==0){
ans.push_back(sequence);
return;
}
if(pos==freq.size()||rest<freq[pos].first){
return;
}
dfs(pos+1,rest);
int most= min(rest/freq[pos].first,freq[pos].second);
for(int i=1;i<=most;i++){
sequence.push_back(freq[pos].first);
dfs(pos+1,rest-i*freq[pos].first);
}
for(int i=1;i<=most;i++){
sequence.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
for(int num:candidates){
if(freq.empty()||num!=freq.back().first){
freq.emplace_back(num,1);
}else{
freq.back().second++;
}
}
dfs(0,target);
return ans;
}
};