您的位置:首页 > 其它

[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 =
[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 算法