该题和LeetCode:Combination Sum 很类似,不同点在于前者是不重复的数字,且组合数字可以重复,后者数字存在重复,然后组合数字不允许重复。相对于上一道题我们做入下简单修改,在递归调用的时候,把起始点改为下一个索引,而不是起始点不变,然后就是判断重复,因为在数组在使用之前我们已经坐了重复处理,所以我们在循环开始时我们采用与三数之和相似的手段即可。
代码入下:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<vector<int>>res;
sort(candidates.begin(),candidates.end());
dfs(res,candidates,{},target,0,0);
return res;
}
void dfs( vector<vector<int>>&res,vector<int>& candidates,vector<int>out,int target,int cur,int start){
if(cur==target){
res.push_back(out);
return ;
}
if(cur>target)
return;
for(int i=start;i<candidates.size();i++){
if(i>start&&candidates[i]==candidates[i-1]) continue;##去重
out.push_back(candidates[i]);
dfs(res,candidates,out,target,cur+candidates[i],i+1);##从下一个索引开始。
out.pop_back();
}
}