class Solution {
public:
vector<vector<int>> all;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
if(candidates.empty()) return all;
vector<int> one;
sort(candidates.begin(),candidates.end());
com(candidates,target,one,0);
sort(all.begin(),all.end());
all.erase(unique(all.begin(),all.end()),all.end());
return all;
}
void com(vector<int>& num,int target,vector<int> & one,int begin){
if(target==0) {all.push_back(one); return;}
for(int i=begin;i<num.size()&&num[i]<=target;i++)
{
one.push_back(num[i]);
com(num, target - num[i], one, i + 1);
one.pop_back();
}
return;
}
};
代码性能不太好,这题与#39很类似,不同在(1)输入存在重复数字,(2)且同一个数字只能使用一次。第二个问题比较好解决,在递归时,下一轮可使用的下标变为i+1即可,第(1)个问题,没想到太好的解决办法,在最后一步返回结果前,对二维数组中的一维数组去重:
sort(all.begin(),all.end());//先排序vector
all.erase(unique(all.begin(),all.end()),all.end());//unique返回的是去重数组的不重复数的下一个下标,也就是重复元素的起始位置。