[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] 416 Partition Equal Subset Sum
LeetCode第[78]题(Java):Subsets(求子集)扩展——第[90]题:Subsets 2