与Combination Sum不同的是:
元素里有重复的,所以最后产生的序列会有重复的,要去重
元素只能用一次,所以每次要从当前元素的下一元素开始循环
为了方便处理,可以每次令index的序号为要保存的元素下一序号。
如果不这么处理,向下面这样处理:
for(int k=index[n]+1;k<candidates.size();k++)
{
index[n+1]=k;
则起始元素会被忽略。
class Solution { private: vector<vector<int>>res; int index_count=10000; public: void findSet(int target,int sum,int index[],int n,vector<int>&candidates) { if(sum>target) return; if(sum==target) { vector<int>result; for(int j=1;j<=n;j++) result.push_back(candidates[index[j]-1]); res.push_back(result); return; } for(int k=index[n];k<candidates.size();k++) { index[n+1]=k+1; findSet(target,sum+candidates[k],index,n+1,candidates); } } vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { sort(candidates.begin(),candidates.end()); res.clear(); int *index=new int[index_count]; memset(index,0,sizeof(int)*index_count); findSet(target,0,index,0,candidates); delete[] index; sort(res.begin(),res.end()); vector<vector<int>>::iterator it; it= unique(res.begin(),res.end()); res.erase(it,res.end()); return res; } };