美文网首页
求包含不同整数的集合所有的子集

求包含不同整数的集合所有的子集

作者: 牛亦非 | 来源:发表于2018-04-03 12:17 被阅读0次

Lintcode地址:http://www.lintcode.com/zh-cn/problem/subsets/
样例:
如果 S = [1,2,3],有如下的解:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

常规思路:递归添加元素,元素有出现和不出现2种状态,用1个数组保存该状态:

    public List<List<Integer>> subsets(int[] nums) {
        int len = nums.length;
        boolean[] marks = new boolean[len];
        List<List<Integer>> result = new ArrayList<>();
        addSub(result, nums, marks, 0, len);
        return result;
    }

    private void addSub(List<List<Integer>> result, int[] nums, boolean[] marks, int start, int len) {
        if (start >= len) {
            List<Integer> subList = new ArrayList<>();
            for (int i = 0; i < len; i++) {
                if (marks[i]) {
                    subList.add(nums[i]);
                }
            }
            result.add(subList);
        } else {
            marks[start] = true;
            addSub(result, nums, marks, start + 1, len);
            marks[start] = false;
            addSub(result, nums, marks, start + 1, len);
        }
    }

在网上看到了另一种更简洁的算法,用二进制整数各位的值表示元素是否出现的状态,循环加1该整数即可输出所有子集。

    public List<List<Integer>> subsets(int[] nums) {
        int len = nums.length;
        List<List<Integer>> result = new ArrayList<>();
        // 子集总数为2的len次幂
        for (int k = 0; k < (1 << len); k++) {
            List<Integer> sub = new ArrayList<>();
            for (int j = 0; j < len; j++) {
                // 第j位为1表示对应的数字出现在子集中
                if (((k >> j) & 1) == 1) {
                    sub.add(nums[j]);
                }
            }
            result.add(sub);
        }
        return result;
    }

相关文章

  • 求包含不同整数的集合所有的子集

    Lintcode地址:http://www.lintcode.com/zh-cn/problem/subsets/...

  • subSets

    题目 给定一个含不同整数的集合,返回其所有的子集(子集中的元素排列必须是非降序的,解集必须不包含重复的子集)如果 ...

  • [40]24点-小米2018秋

    1.题目描述 有n个1~23的整数,写一个算法,求出有多少个相互不同的子集合的和为24点。 输入描述:输入数据包含...

  • 24点--(小米2018)

    题目:有n个1~23的整数,写一个算法,求出有多少个相互不同的子集合的和为24点。输入描述:输入数据包含一组每组的...

  • 求集合的所有子集

    求集合的所有子集 对于任意集合A,元素个数为n(空集n=0),其所有子集的个数为2^n个 如集合A={a,b,c}...

  • 每日一题之幂集

    题目:幂集 幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。 说明:解集不能包含重复的子集。 示...

  • 面试题 08.04. 幂集

    题意:幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。说明:解集不能包含重复的子集。 解法1:回...

  • 第 6 章 整数集合

    整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的数量不多时,Redis 就会使用整数集合...

  • 第三讲 递归(5)——练习4.1:集合子集

    练习:集合子集 题目要求 求给定集合的所有子集 分析 代码——我的1 代码——我的2(改进) 改进点:用更简洁的方...

  • Redis-数据结构-整数集合、压缩列表

    一、整数集合 整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且元素数量不多,Red...

网友评论

      本文标题:求包含不同整数的集合所有的子集

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