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],
      []
    ]
    


    基本思路:

    求子集问题能够转换为子集的二进制表示。

    首先。一个包括n个元素的set,其子集个数为2^n; 能够对set中的元素依照二进制编号。

    每一个子集能够表示为二进制形式。比方:[1,3]表示为二进制为101。

    所以,全部子集就是0~2^-1的二进制表示形式到子集的映射。


    代码:

    vector<vector<int> > subsets(vector<int> &S) {  //C++
            vector<vector<int> > result;
            int size = S.size();
            //add empty subset
            vector<int> tmp;
            result.push_back(tmp);
            
            int bound = 1<<size;
            for(int i = 1; i < bound; i++){
                vector<int> vec;
                int num = i;
                for(int j = size; j > 0 && num >0; j-- ){
                    int tmp = (1 << j-1);
                    if(num >= tmp){
                        vec.push_back(S[j-1]);
                        num -= tmp;
                    }
                }
                sort(vec.begin(),vec.end());
                result.push_back(vec);
            }
            return result;
        }


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    spring查看生成的cglib代理类源码详解
    java-jdk动态代理生成的代理类源码
    约瑟夫斯问题-java版数组解法和链表解法
    HashMap源码解析(简单易懂)
    windows云服务器发布项目
    java学习
    TTL macro登陆linux服务器
    c#笔记
    C#笔记
    git merge
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4676584.html
Copyright © 2011-2022 走看看