[LeetCode] Subsets
2013-11-06 16:59
295 查看
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 =
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], [] ] 问题描述:给定一个集合S,其中的元素各不相同,返回所有可能的子集。注意:每个子集的元素以非降序排列,集合中不含重复元素,如上例所示。 这个问题可以转化为另外一个问题:从集合从任意选取若干个元素。如果这个问题解决了,那么就可以以元素个数来分别获得子集。 要从集合中任意选取若干个元素,可以分成两种情况: 某个元素要么被选取,要么不被选取。 因此,可以采用递归。 代码中的vector<vector<int> > selectn(vector<int> s, int n)函数就是实现从s中选取n个元素构成所有n个元素的子集。 在代码中分为4中情况进行讨论: (1)s.size() <= n 也就是选取的个数大于或者等于集合s的元素个数,此时,返回只有s本身构成的子集; (2)n == 0 返回空集; (3)n == 1 s中每个元素构成一个子集; (4)其它 以第一个元素是否在子集中获得两部分子集,再将两部分子集合并。 由于给定的集合不一定是有序的,但是子集必须是有序的,因此,在得到子集之前使用sort();将集合S进行排序。
class Solution { public: vector<vector<int> > selectn(vector<int> s, int n) { if(s.size() <= n) return vector<vector<int> >(1, s); if(n == 0) return vector<vector<int> >(); if(n == 1) { vector<vector<int> > vec; vector<int> ivec; for(vector<int>::iterator iter = s.begin(); iter != s.end(); ++iter) { ivec.push_back(*iter); vec.push_back(ivec); ivec.clear(); } return vec; } int first_elem = s.front(); s.erase(s.begin()); vector<vector<int> > vec1 = selectn(s, n - 1); vector<vector<int> > vec2 = selectn(s, n); for(vector<vector<int> >::iterator iter = vec1.begin(); iter != vec1.end(); ++iter) { (*iter).insert((*iter).begin(), first_elem); vec2.push_back(*iter); } return vec2; } vector<vector<int> > subsets(vector<int> &S) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. sort(S.begin(), S.end()); vector<vector<int> > vec; vector<vector<int> > vec_tmp; vec.push_back(vector<int>()); int len = 0; for(len = 0; len <= S.size(); ++len) { vec_tmp = selectn(S, len); for(vector<vector<int> >::iterator iter = vec_tmp.begin(); iter != vec_tmp.end(); ++iter) { vec.push_back(*iter); } } return vec; } };
相关文章推荐
- Leetcode | Partition to K Equal Sum Subsets
- leetcode--Subsets
- [C++]LeetCode: 63 Subsets
- (LeetCode 78)SubSets
- LeetCode 78. Subsets
- Leetcode-subsets
- [leetcode] Subsets
- [leetCode] Subsets
- Leetcode: Subsets & SubsetsII
- leetcode(78):Subsets
- LeetCode:8.1 Subsets
- LeetCode – Refresh – Subsets
- leetcode Subsets II
- 44_leetcode_Subsets
- [LeetCode][JavaScript]Subsets
- [Leetcode]Subsets
- leetcode---Subsets
- [LeetCode 78] Subsets
- LeetCode 78. Subsets
- 【LeetCode】78_Subsets