码迷,mamicode.com
首页 > 其他好文 > 详细

Subsets

时间:2019-05-20 23:01:44      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:code   enter   int   ...   out   vector   center   net   情况   

Given a set of distinct integers, nums, return all possible subsets (the power set).

Example:

Input: nums = [1,2,3]
Output:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

code1:

  recursion:对于个数字都有拿与不拿两种情况;如果拿后面对应一种情况,如果不拿后面又对应一种情况,可用recursion

class Solution
{
private:
    void subsets(int start,vector<int> &nums,vector<int> &tmp,vector<vector<int>> &res)
    {
        if(start==nums.size())
        {
            res.push_back(tmp);
            return ;
        }

        tmp.push_back(nums.at(start));
        subsets(start+1,nums,tmp,res);
        tmp.pop_back();
        subsets(start+1,nums,tmp,res);

        return ;
    }
public:
    vector<vector<int>> subsets(vector<int>& nums)
    {
        if(nums.empty())
            return {};

        vector<vector<int>> res;
        vector<int> tmp;
        subsets(0,nums,tmp,res);
        return  res;
    }
};

code2:

  对于{1,2,3}这个数组

  1. 首先空集{}肯定是一个子集(因为空集是任何集合的子集),此时res中有一个元素为{}
  2. 对于元素1,res就是{}和{1}
  3. 对于元素2,把前面的res中的每个元素中加上2,就得到含有2的所有的情况
  4. ......
class Solution
{
public:
    vector<vector<int>> subsets(vector<int>& nums)
    {
        if(nums.empty())
            return {};

        vector<vector<int>> res;
        vector<int> tmp;
        res.push_back(tmp);
        for(int i=0;i<nums.size();++i)
        {
            int len=res.size();
            for(int j=0;j<len;++j)
            {
                tmp=res.at(j);
                tmp.push_back(nums.at(i));
                res.push_back(tmp);
            }
        }
        return  res;
    }
};

code3:

  位运算;每个元素都可能出现或不出现,故每个元素有两种情况,所以对于{1,2,3}来讲,结果数组中共有2^3=8中情况。每个子集的序号的二进制表示,把是1的位对应原数组中的数字取出来就是一个子集,八种情况都取出来就是所有的子集了

出来就是一个子集,八种情况都取出来就是所有的子集了,参见代码如下:

  1 2 3 Subset
0 F F F []
1 F F T 1
2 F T F 2
3 T T F 1,2
4 F F T 3
5 T F T 1,3
6 F T T 2,3
7 T T T 1,2,3
class Solution
{
public:
    vector<vector<int>> subsets(vector<int>& nums)
    {
        if(nums.empty())
            return {};

        int size=1<<nums.size();
        vector<vector<int>> res(size);
        for(int i=0;i<size;++i)
        {
            for(int j=0;j<nums.size();++j)
                if((i>>j)&0x01)
                    res.at(i).push_back(nums.at(j));
        }

        return  res;
    }
};

 常见的位操作:https://blog.csdn.net/u014110320/article/details/78713871

Subsets

标签:code   enter   int   ...   out   vector   center   net   情况   

原文地址:https://www.cnblogs.com/tianzeng/p/10896970.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!