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

  • 相关阅读:
    day35—JavaScript操作元素(创建、删除)
    day34—JavaScript实现DOM操作
    day33—前端开发的模块化和组件化
    day32—CSS多列布局学习
    day31—CSS Reset 与页面居中布局
    JVM(18)之 Class文件
    JVM(17)之 准备-解析-初始化
    JVM(16)之 双亲委派模型
    JVM(15)之 类加载器
    JVM(14)之 类加载机制
  • 原文地址:https://www.cnblogs.com/love-yh/p/7126492.html
Copyright © 2020-2023  润新知