美文网首页
lintcode 17 子集

lintcode 17 子集

作者: 小雨启明 | 来源:发表于2018-11-06 10:30 被阅读0次

1、递归方法

原集合每一个数字只有两种状态,要么存在,要么不存在,那么在构造子集时就有选择和不选择两种情况,所以可以构造一棵二叉树,左子树表示选择该层处理的节点,右子树表示不选择,最终的叶节点就是所有子集合,树的结构如下:


捕获.JPG

递归方法:

class Solution {
public:
    /**
     * @param nums: A set of numbers
     * @return: A list of lists
     */
    vector<vector<int>> subsets(vector<int> &nums) {
        // write your code here
        vector<vector<int>> res;
        if(nums.size() == 0){
            res.push_back(nums);
            return res;
        }
        sort(nums.begin(),nums.end());
        vector<int> temp;
        help(res,nums,0,temp);
        return res;
    }
    
    void help(vector<vector<int>> &res, vector<int> &nums,int i,vector<int> p){
        if(i == nums.size()){//基本情况,添加结果,退出
            res.push_back(p);
            return;
        }else{
            help(res,nums,i+1,p);//不加入当前节点,处理后续节点
                                              //注意 p在当前层的值不变
            p.push_back(nums[i]);//加入当前节点
            help(res,nums,i+1,p);//处理后续节点
        }
    }
    
    
};

1、非递归方法

思路分析:n个元素的子集共有2^n个,其中包括空集。
(1)假设有3个元素{a, b, c},那么此时有 2^3 个子集,即8个子集。
(2)因为有8个子集,而且包括空集,注意7对应的二进制形式为111,并且二进制数刚好3位;所以(000 ~ 111)可分别对应一个子集,若该位为1,则表示该元素出现在子集中,若该位为0,则表示该元素不出现在子集中;
(3)注意:001中的1在低位,对应的是a,即数组中的首个元素。
(4)举例
111表示子集abc;
110表示子集bc;
101表示子集ac;
100表示子集c;
011表示子集ab
010表示子集b;
001表示子集a;
000则表示空集;

class Solution {
public:
    /**
    * @param nums: A set of numbers
    * @return: A list of lists
    */
    vector<vector<int>> subsets(vector<int> &nums) {
        // write your code here
        int len = nums.size();
        vector<vector<int>> res;
        if (len == 0) {
            res.push_back(nums);
            return res;
        }

        int n = 1 << len;//一共有多少个子集

        for (int i = 0; i < n; i++) {
            vector<int> line;
            int mark = i;//当循环内部对i处理时 必须处理i的备份
            int j = 0;//遍历当前i值
            while (mark > 0) {
                if (mark & 1) {
                    line.push_back(nums[j]);
                }
                mark = mark >> 1;
                j++;
            }
            res.push_back(line);//保存当前i的子集
        }

        return res;
    }
};

相关文章

  • lintcode 17 子集

    1、递归方法 原集合每一个数字只有两种状态,要么存在,要么不存在,那么在构造子集时就有选择和不选择两种情况,所以可...

  • Algorithms ladder I

    24 Dec Mission: lintcode 13 strStr lintcode 17 Subsets li...

  • LintCode 18. 子集 II

    题目描述 给定一个可能具有重复数字的列表,返回其所有可能的子集。 测试样例 输入:[0]输出:[ [], [0]]...

  • 没有交集的子集

    从前,在一个叫做D13的全集里,有一个子集17,和一个子集37。没有人知道,子集37一直喜欢着子集17。只可惜,这...

  • lintcode 子集和带重复数字的子集

    第十七题是给定一个不含重复数字的集合,返回其子集;十八题是给定一个可能有重复数字的集合,返回其子集。先来说没有重复...

  • LintCode-最大整除子集-动态规划

    描述 给一个由 无重复的正整数 组成的集合,找出满足任意两个元素 (Si, Sj) 都有 Si % Sj = 0 ...

  • LintCode每日一练-限制条件子集

    问题:限制条件子集 给一个数组,给定一个target,求满足以下条件的子集个数:条件:子集中的最小值+最大值小于给...

  • 程序员常用的刷题网站

    1、Lintcode Lintcode.com——LintCode网站是国内较大的在线编程&测评网站。此网站提供各...

  • Singleton

    lintcode: http://lintcode.com/en/problem/singleton/ Java ...

  • 二叉树非递归遍历——已通过LintCode

    先序遍历 LintCode题目链接 中序遍历 LintCode题目链接 后序遍历 LintCode题目链接由于在L...

网友评论

      本文标题:lintcode 17 子集

      本文链接:https://www.haomeiwen.com/subject/kxuyxqtx.html