Combination Sum II

与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;
    }
};
原文地址:https://www.cnblogs.com/daocaorenblog/p/5277319.html