给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合
思路:递归回溯,需要注意的是candidats数组中有重复的数字,但是不能有重复的组合,需要对于当前递归树层进行去重判断
class Solution {
vector<vector<int>> ans_sum;
vector<int>ans;
int sum=0;
void find(vector<int>& candidates, int target,int start)
{
if(sum>target)
{
return;
}
if(sum==target)
{
ans_sum.push_back(ans);
return;
}
for(int i=start;i<candidates.size();i++)
{
//当前递归层进行重复元素判断
if(i>start&&candidates[i-1]==candidates[i])
{
continue;
}
sum+=candidates[i];
ans.push_back(candidates[i]);
find(candidates,target,i+1);
sum-=candidates[i];
ans.pop_back();
}
}
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
find(candidates,target,0);
return ans_sum;
}
};