您的位置:首页 > 其它

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

2017-07-06 15:17 525 查看

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 =[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]。图形化的说明参见这里。代码如下:

1 class Solution {
2 public:
3     vector<vector<int> > subsets(vector<int> &S)
4     {
5         vector<vector<int>> res;
6         vector<int> midArray;
7         sort(S.begin(),S.end());
8         getSubsets(S,0,midArray,res);
9
10         return res;
11     }
12
13     void getSubsets(vector<int> &S,int beg,vector<int> &midArray,vector<vector<int>> &res)
14     {
15         res.push_back(midArray);
16         for(int i=beg;i<S.size();++i)
17         {
18             midArray.push_back(S[i]);
19             getSubsets(S,i+1,midArray,res);
20             midArray.pop_back();
21         }
22     }
23 };

 

方法二:使用迭代法,思路:拿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], 再加上之前的子集就是所有的子集合了,代码如下:

1 class Solution {
2 public:
3     vector<vector<int> > subsets(vector<int> &S)
4     {
5         vector<vector<int>> res(1); //放入空
6         if(S.size()) return res;
7         sort(S.begin(),S.end());
8
9         for(int i=0;i<S.size();++i)
10         {
11             int midSize=res.size();
12             for(int j=0;j<midSize;++j)  //实时结合
13             {
14                 res.push_back(res[j]);
15                 res.back().push_back(S[i]);
16             }
17         }
18
19         return res;
20     }
21 };

 

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: