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

  • 相关阅读:
    剑指Offer47 不用加减乘除做加法
    剑指Offer46 求1+2+...+n
    剑指Offer45 约瑟夫环
    剑指Offer44 扑克牌的顺子
    剑指Offer43 n个骰子点数概率
    面试题分享
    初识python版本
    redis安装部署
    配置本地yum源
    闭包、装饰器
  • 原文地址:https://www.cnblogs.com/love-yh/p/7126492.html
Copyright © 2011-2022 走看看