Combination Sum 2 不允许重复

来源:互联网 发布:asp网页 sql数据库 编辑:程序博客网 时间:2024/05/17 08:10

虽然号称为combination sum的follow up,我觉得不如原题有难度。不重复是比较自然的。

下次遍历是从当前元素的下一个开始就可以了。这道题仍然存在重复序列的问题,也就是符合条件的相同序列存在多个,如何去重呢?一种办法是保存所有符合条件的序列,最后对总结果进行sort , unique ,resize,这样做代价还是比较大的。另一种做法是防患于未然,提前把可能存在的重复干掉。因为已知序列经过预处理排序,所以可能导致相同序列的数值都是集中在一起的,也就是该数值如果包含在有效序列中的话,那么只能存在一次,那么后面相同的只要跳过即可。注意:只是在本次计算中跳过,而不是总循环中跳过,还是代码中比较清楚:

class Solution {public:    void doit(vector<int> &num,int target,int start,vector<int> &tmp,vector<vector<int>> &res){        if(target==0){            res.push_back(tmp);            return ;        }                for(int i=start;i<num.size();++i){            if(target-num[i]<0)continue;            tmp.push_back(num[i]);            doit(num,target-num[i],i+1,tmp,res);            tmp.pop_back();            //if next is same ,then may exists duplicated sequence, just skip it!            while(i<num.size()-1 and num[i]==num[i+1]) i++;        }    }        vector<vector<int> > combinationSum2(vector<int> &num, int target) {        vector<vector<int>> res;        vector<int> tmp;        if(num.size()==0) return res;                sort(num.begin(),num.end());        doit(num,target,0,tmp,res);        //another way to handle duplicates        //sort(res.begin(),res.end());        //auto it=unique(res.begin(),res.end());        //res.resize(distance(res.begin(),it));                return res;    }};


0 0
原创粉丝点击