[Leetcode] subsets 求数组所有的子集

时间:2021-07-06 12:11:14

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],
[]
]

题意:求数组的所有子集,子集不用如例子中那样排序

思路:题中要求子集中非降序排列,所以要先进行排序。方法一是使用DFS遍历。如:[1,2,3] ,依次加入[ ]、[1]、[1,2]、[1,2,3]、[1,3]、[2]、[2,3]、[3]。图形化的说明参见这里。代码如下:

 class Solution {
public:
vector<vector<int> > subsets(vector<int> &S)
{
vector<vector<int>> res;
vector<int> midArray;
sort(S.begin(),S.end());
getSubsets(S,,midArray,res); return res;
} void getSubsets(vector<int> &S,int beg,vector<int> &midArray,vector<vector<int>> &res)
{
res.push_back(midArray);
for(int i=beg;i<S.size();++i)
{
midArray.push_back(S[i]);
getSubsets(S,i+,midArray,res);
midArray.pop_back();
}
}
};

方法二:使用迭代法,思路:拿res中已经存在的元素和新的组合,然后重新放入res中,先给res中放入一个空元素,然后通过空元素和S中第一个元素结合放入res中,以此类推,参考了Grandyang的博客。如:[1,2,3],最开始是空集,那么我们现在要处理1,就在空集上加1,为[1],结果中位[]和[1],下面处理2,在之前的子集基础上,每个都加个2,可以分别得到[2],[1, 2],那么现在所有的子集合为[], [1], [2], [1, 2],同理处理3的情况可得[3], [1, 3], [2, 3], [1, 2, 3], 再加上之前的子集就是所有的子集合了,代码如下:

 class Solution {
public:
vector<vector<int> > subsets(vector<int> &S)
{
vector<vector<int>> res(); //放入空
if(S.size()) return res;
sort(S.begin(),S.end()); for(int i=;i<S.size();++i)
{
int midSize=res.size();
for(int j=;j<midSize;++j) //实时结合
{
res.push_back(res[j]);
res.back().push_back(S[i]);
}
} return res;
}
};

在牛客网上,之前通过,现在显示如下,吐槽一下。

[Leetcode] subsets 求数组所有的子集

Felix对给定一个集合,求出这个集合所有的子集(所谓子集,就是包含原集合中的一部分元素的集合)进行了总结。