[leetcode] Subsets II

来源:互联网 发布:现货知乎 编辑:程序博客网 时间:2024/06/10 20:06

Given a collection of integers that might contain duplicates, S, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

For example,
If S = [1,2,2], a solution is:

[  [2],  [1],  [1,2,2],  [2,2],  [1,2],  []]
可以首先参考一下setsubs I 的解法: 点击打开链接

subsets II 和 I 的区别就是在于去重,一个比较直观 + 懒惰的思路是用一个set来记录最后结果 -_-||, 利用set自带的去重功能就做好了~ 撒花!
我开始就是这么想滴,然后。。。time limit exceeds....看来出题的人不想让偶这么做。。。

于是乎,就出来了以下版本。。。
思路是:
1. 对每个元素出现的次数做一个统计,可以用两个vector, elem 和 num
2. num[i]就是当前元素elem[i] 最多可能出现的次数
3. 把N个for改成一个while,方法就是用一个奇妙的数字来统计每个elem出现的次数, 进位数满足num的规律

呵呵。。。是不是听晕了。。。

64ms过大集合~~yeah

class Solution {public:    vector<vector<int> > subsetsWithDup(vector<int> &S) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        vector<vector<int> > ret;        if(S.empty()) return ret;                sort(S.begin(), S.end());                vector<int> elem(1, S[0]);        vector<int> num(1,1);                //calculate times each element appears in S        for(int i = 1; i < S.size(); i++){            if(S[i] == elem.back()){                num.back()++;            }else{                elem.push_back(S[i]);                num.push_back(1);            }        }                vector<int> cur(num.size(), 0);        vector<int> tmp;        //main part        int carry = 0;        while(carry == 0){            tmp.clear();            //push_back current result            for(int i = 0; i < elem.size(); i++){                tmp.insert(tmp.end(), cur[i], elem[i]);            }            ret.push_back(tmp);                        //cur++            int i = 0;            while(i < cur.size()){                if(cur[i] < num[i]){                    cur[i]++;                    break;                }else{                    cur[i] = 0;                    i++;                    if(i == num.size()) carry = 1;                }            }                    }                        return ret;    }};