题目
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例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]
]
解法
- 与77.组合和39.组合总数类似
- 回溯跳出的条件: 解中的大小等于target
- 回溯放入的数字:后面的大于等于前面的,用now_id存储下标,从now_num开始遍历
- 不同的是只能选择一个,可以排序后放入set去重
- 排序后 比较前后
代码
#include <stdio.h>
#include <iostream>
#include <set>
#include <vector>
using namespace std;
/*
class Solution {
public:
set<vector<int>> ans;
vector<int> tmp;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
dfs(0,target,0,candidates);
vector<vector<int>> ans1(ans.begin(),ans.end());
return ans1;
}
void dfs(int now_id,int target,int now_sum,vector<int> &candidates){
if(now_sum > target){return;}
if(now_id > candidates.size()){return;}
if(now_sum==target){
ans.insert(tmp);
return ;
}
for(int i=now_id;i<candidates.size();i++){
now_sum += candidates[i];
tmp.push_back(candidates[i]);
dfs(i+1,target,now_sum,candidates);
tmp.pop_back();
now_sum -= candidates[i];
}
}
};
*/
class Solution {
public:
vector<vector<int>> ans;
vector<int> tmp;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
dfs(0,target,0,candidates);
return ans;
}
void dfs(int now_id,int target,int now_sum,vector<int> &candidates){
if(now_sum > target){return;}
if(now_id > candidates.size()){return;}
if(now_sum==target){
ans.push_back(tmp);
return ;
}
for(int i=now_id;i<candidates.size();i++){
//重点
if(i>0 && i > now_id &&candidates[i]==candidates[i-1]){continue;}
tmp.push_back(candidates[i]);
dfs(i+1,target,now_sum+candidates[i],candidates);
tmp.pop_back();
}
}
};
int main()
{
vector<int> candidates{2,5,2,1,2};
int target = 5;
Solution s;
vector<vector<int>> ans = s.combinationSum2(candidates, target);
for(int i=0;i<ans.size();i++){
for(int j=0;j<ans[i].size();j++){
if(j!=0) cout<<",";
cout<<ans[i][j];
}
cout<<endl;
}
return 0;
}
今天也是爱zz的一天哦!