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], [] ]因为要以递增顺序输出子集元素,所以先排序。
然后找规律:
[]
1
2
1 2
3
1 3
2 3
1 2 3
然后编码实现:
class Solution {
public:
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int> > result(1);
sort(S.begin(), S.end());
for (auto a : S)
{
size_t n = result.size();
for (size_t i = 0; i < n; i++)
{
result.push_back(result[i]);
result.back().push_back(a);
}
}
return result;
}
};再用同样的方法尝试带重复的。
[]
1
2
1 2
2 -
12 -
2 2
1 2 2
2 -
12 -
2 2 -
1 2 2-
2 2 2
1 2 2 2
你找到规律了吗?反正我找到了。
class Solution {
public:
vector<vector<int> > subsetsWithDup(vector<int> &S) {
vector<vector<int> > result(1);
sort(S.begin(), S.end());
size_t prevn = 1;
for (size_t i = 0; i < S.size(); i++)
{
size_t n = result.size();
if (i > 0 && S[i - 1] != S[i])
prevn = n;
for (int j = n - prevn; j < n; j++)
{
result.push_back(result[j]);
result.back().push_back(S[i]);
}
}
return result;
}
};
本文介绍了使用递归方法生成给定整数集合的所有可能子集,并提供了编码实现,包括处理重复元素的情况。
1万+

被折叠的 条评论
为什么被折叠?



