思想和LeetCode39:https://blog.csdn.net/Jeff_Winger/article/details/81589910 一致。都是深度优先搜索,区别是本次组合中在一个子集中不能重复使用数组中的数字。当然在子集中可以使用其他子集的元素,子集之间不能重复。为了防止添加相同集合在结果数组中,我们先对原数组排序。结果数组用set表示,set的类型vector<int>表示子集,最后把set转换为结果数组。
代码如下:
class Solution {
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
set<vector<int> > setV;
vector<int> temp;
int n=candidates.size();
vector<int> used(n,0);
sort(candidates.begin(),candidates.end());
dfs(candidates,target,0,setV,temp,used);
vector<vector<int>> result(setV.begin(),setV.end());
return result;
}
void dfs(vector<int>& candidates,int target,int begin,set<vector<int>>& result,vector<int>& temp,vector<int>& used)
{
if(target==0){
result.insert(temp);
return;
}else if(target<0){
return;
}else{
for(int i=begin;i<candidates.size();i++){
if(used[i]==0){
used[i]=1;
temp.push_back(candidates[i]);
dfs(candidates,target-candidates[i],i+1,result,temp,used);
used[i]=0;
temp.pop_back();
}
}
}
}
};