Subsets II

来源:互联网 发布:php小项目 编辑:程序博客网 时间:2024/05/19 23:04

方法1:按照Subsets I 的方法做,解出子集后去重


方法2:前一部分的解题思路和Subsets I一样,对于重复的元素,记录每个数字重复出现的次数,进行组合,例如对于1,2,2,由于2出现了两次,所以可能的组合是不选2,选一个2,选两个2,这样得到的结果就是   空集; 1 ; 2,; 1,2 ; 2,2; 1,2,2;

    class Solution {public:    vector<vector<int> > subsetsWithDup(vector<int> &S) {        vector<vector<int> > totalset = {{}};        sort(S.begin(),S.end());        for(int i=0; i<S.size();){            int count = 0; // num of elements are the same            while(count + i<S.size() && S[count+i]==S[i])  count++;            int previousN = totalset.size();            for(int k=0; k<previousN; k++){                vector<int> instance = totalset[k];                for(int j=0; j<count; j++){                    instance.push_back(S[i]);                    totalset.push_back(instance);                }            }            i += count;        }        return totalset;        }};

方法3:通过判断条件进行复杂的分枝控制,在迭代过程中减掉重复的分枝

class Solution{public:void sub(vector<vector<int>> &ans, vector<int> &sets, vector<int> &A, int j) {if (j >= A.size()) {return;} for (int i = j; i<A.size(); i++) {if (i>j && A[i] == A[i - 1])continue;sets.push_back(A[i]); ans.push_back(sets);sub(ans, sets, A, i + 1);sets.pop_back();//利用出栈以及前面的if条件进行剪枝}}vector<vector<int>> subsetsWithDup(vector<int>& A) {vector<vector<int>> ans;vector<int> sets;sort(A.begin(), A.end());ans.push_back(sets);sub(ans, sets, A, 0);return ans;}};




0 0
原创粉丝点击