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

Posted 王大咩的图书馆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Leetcode] subsets 求数组所有的子集相关的知识,希望对你有一定的参考价值。

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

 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对给定一个集合,求出这个集合所有的子集(所谓子集,就是包含原集合中的一部分元素的集合)进行了总结。

以上是关于[Leetcode] subsets 求数组所有的子集的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-Subsets-78

[LeetCode] 416 Partition Equal Subset Sum

LeetCode第[78]题(Java):Subsets(求子集)扩展——第[90]题:Subsets 2

Leetcode78. Subsets(求集合的子集问题)

leetcode 416. Partition Equal Subset Sum 分割等和子集(中等)

leetcode368. Largest Divisible Subset