[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; }};
- 【LeetCode】 Subsets Subsets II
- 【LeetCode】Subsets & Subsets II
- LeetCode Subsets && Subsets II
- LeetCode Subsets && Subsets II
- LeetCode-Subsets & Subsets II
- [LeetCode] Combinations、Subsets、Subsets II
- 【Leetcode】【python】Subsets/Subsets II
- LeetCode: Subsets II
- LeetCode SubSets II
- LeetCode: Subsets II
- leetcode 48: Subsets II
- [LeetCode] Subsets II
- [Leetcode] Subsets II
- [leetcode] Subsets II
- leetcode Subsets II
- leetcode Subsets II problem
- [LeetCode]Subsets II
- [leetcode]Subsets II
- qtopia-2.2.0的交叉编译以及移植Ⅱ(在Fedora下构建嵌入式QT环境)
- Hibernate 开发流程笔记(中)
- Maven和Tycho
- 网络团购业继续洗牌
- 改变你一生的30个关键习惯
- [leetcode] Subsets II
- android模拟器调整尺寸和内存大小
- Step Three: Escape!
- QString C程序员的注意事项
- Android ViewFlipper的使用 实现页面滑动
- 帮您快速入门 TI 的 Codec Engine
- linux菜鸟在ubuntu下编译了arm的c程序
- Android短信拦截
- PostgreSQL数据库、表空间、角色及用户