Leetcode: Subsets & SubsetsII
2014-06-13 20:46
323 查看
Subsets Description:
Given a set of distinct integers, 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 =
分析: 首先注意集合内的元素都是不同的整数,所以尽情产生就好了。产生subsets时,基本思想是由小到大,先产生小的,再
利用小的产生大集合。具体来说,就是先用0个,1个,...来生成子集然后对新的元素,只要把前面的所有子集中加上个新元素,然后和之前
的子集和在一起,就是所有子集了。这里能直接加元素,就是因为没有重复的整数
SubsetsII Description:
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 =
分析:这个题目和上面的唯一区别就在于集合中有相同的元素, 然后再遇到后面是相同元素的时候,添加到子集中产生新子集时,相当于要选择往里面添加几个这个元素。
这里直接用跟上面一样的方法,只是再最后把它们放到set中,去除重复元素,然后再放回vector中返回。这种方法好像有点萌蠢。。 但是呢,根据上面的分析,还有一种
做法,就是将vector中所有元素遍历一遍,放到map中,map中key就是元素值,value是重复的个数,然后就用这个map开始同样的过程,只是产生新的子集的时候
,根据value值,分别产生加不同数量的该元素。
Given a set of distinct integers, 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,3], a solution is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
分析: 首先注意集合内的元素都是不同的整数,所以尽情产生就好了。产生subsets时,基本思想是由小到大,先产生小的,再
利用小的产生大集合。具体来说,就是先用0个,1个,...来生成子集然后对新的元素,只要把前面的所有子集中加上个新元素,然后和之前
的子集和在一起,就是所有子集了。这里能直接加元素,就是因为没有重复的整数
class Solution { public: vector<vector<int> > subsets(vector<int> &S) { sort(S.begin(),S.end()); vector<vector<int> > result; vector<int> comb; result.push_back(comb); for(int i=0;i<S.size();i++) { int nows = result.size(); for(int j=0;j<nows;++j) { comb = result[j]; comb.push_back(S[i]); result.push_back(comb); } } return result; } };
SubsetsII Description:
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], [] ]
分析:这个题目和上面的唯一区别就在于集合中有相同的元素, 然后再遇到后面是相同元素的时候,添加到子集中产生新子集时,相当于要选择往里面添加几个这个元素。
这里直接用跟上面一样的方法,只是再最后把它们放到set中,去除重复元素,然后再放回vector中返回。这种方法好像有点萌蠢。。 但是呢,根据上面的分析,还有一种
做法,就是将vector中所有元素遍历一遍,放到map中,map中key就是元素值,value是重复的个数,然后就用这个map开始同样的过程,只是产生新的子集的时候
,根据value值,分别产生加不同数量的该元素。
class Solution { public: vector<vector<int> > subsetsWithDup(vector<int> &S) { sort(S.begin(),S.end()); set<vector<int> > setres; vector<vector<int> > results; vector<int> comb; results.push_back(comb); for(int i=0;i<S.size();i++) { int nows = results.size(); for(int j=0;j<nows;++j) { comb = results[j]; comb.push_back(S[i]); results.push_back(comb); } } setres.insert(results.begin(),results.end()); results.assign(setres.begin(),setres.end()); return results; } };
相关文章推荐
- #LeetCode#SubSets & SubSetsII
- 【LeetCode】Subsets & Subsets II
- <LeetCode OJ> 78 / 90 Subsets (I / II)
- LeetCode解题报告—— Word Search & Subsets II & Decode Ways
- [leetcode 78 & 90, Medium] Subsets I and II
- leetcode 491. Increasing Subsequences & lc 78. Subsets
- leetcode题解-78. Subsets && 90. Subsets II
- [Leetcode]Subsets I&II
- 【leetcode】Subsets 1&2
- 【leetcode】Subsets I & II
- LeetCode Subsets && Subsets II
- <LeetCode OJ> 78. Subsets
- Leetcode | Subsets I & II
- LeetCode: Subsets I & II
- LeetCode-Subsets & Subsets II
- Leetcode 78&90. Subsets I & II 【排列与组合的生成总结】
- [Leetcode] #78#90 Subsets I & II
- [LeetCode] Subsets(!!!!!回溯&&迭代&&位操作)(to be updated)
- LeetCode Subsets && Subsets II
- 【LeetCode】Subsets I && II