输出一个集合的所有子集,从长到短

public class Ziji {

    public static List<List<Integer>> Sets(int a[]) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        int len = a.length;
        int n = 1 << len;
        for (int i = n; i > 0; i--) {
            int k = i;
            List<Integer> list = new ArrayList<Integer>();
            for (int j = 0; j < len; j++) {
                if ((k & 1) == 1) {
                    list.add(a[j]);
                }
                k = k >> 1;
            }
            res.add(list);
        }
        Collections.sort(res, new Comparator<List<Integer>>() {

            @Override
            public int compare(List<Integer> listA, List<Integer> listB) {
                // TODO Auto-generated method stub
                return listB.size() - listA.size();
            }
        });
        return res;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] a = { 1, 2, 3, 4 };
        List<List<Integer>> res = Ziji.Sets(a);
        for (List<Integer> rr : res) {
            for (Integer r : rr) {
                System.out.print(r);
            }
            System.out.println("\n");
        }
    }
}

用到了位操作的知识,感觉比较巧妙和高效。

时间: 2024-12-14 09:57:39

输出一个集合的所有子集,从长到短的相关文章

求一个集合的所有子集问题

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/31042651 作者:小马 一个包含n个元素的集合,求它的所有子集.比如集合A= {1,2,3}, 它的所有子集是: { {1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}, @}(@表示空集). 这种问题一般有两种思路,先说说第一种,递归.递归肯定要基于一个归纳法的思想,这个思想用到了二叉树的遍历,如下图所示: 可以这样理解这张图,从集合A的每

枚举一个集合的所有子集

一个神奇的算法,在题目中看到的,单独拿出来整理枚举一个集合S(用一个二进制表示)的所有子集S0: for(int S0 = S; S0; S0 = (S0-1)&S){}

求一个集合的全部子集 假设都是Int类型的元素

vector<int> int2bin_vec(int n, UL bit_num){ vector<int> res(bit_num, 0); auto it = res.begin() + res.size() - 1; while( n != 0){ *it = (n % 2); it--; n /= 2; } return res; } vector<int> zero_one2subset(const vector<int>& zero_o

python 实现求一个集合的子集

概要 今天偶然看到有个关于数学中集合的问题,就突发奇想的想用python实现下求一个集合的子集. 准备 我当然先要复习下,什么是集合,什么是子集? 比较粗犷的讲法,集合就是一堆确定的东西,细致一点的讲法呢,就是由一个或多个确定的元素所构成的整体,集合中的东西称为元素. 集合有一些特性: 1.确定性 给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现. 2.互异性 一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次.有时需要对同一元素

59-python基础-python3-集合-集合常用方法-判断一个集合是否是另一个集合的子集-issubset()-issuperset()

判断一个集合是否是另一个集合的子集-issubset()-issuperset() 1-issubset() s1.issubset(s) 判断s1是否是s的子集 2-issuperset() 与issubset()相反 原文地址:https://www.cnblogs.com/summer1019/p/11384528.html

湘潭大学OJ1199Number Game(求一个集合的最小公倍数)

题目描述 给你一个有N个数的集合S和一个数X,判断是否存在S的一个子集,子集里的数的最小公倍数正好是X. 输入 第一行是数据组数T. 接下来有多组数据,每组数据包含两行: 第一行有2个数N和X,1<=N<=100000 ,X<=10^9. 第二行给出N个数,1<=S[i]<=10^9. 输出 对于每一组数据,输出一行"Case #X: Y",X是第几组数据,Y是Yes或No. 样例输入 2 4 20 2 3 4 5 3 61 3 4 5 样例输出 Case

JavaScript面试题:重复输出一个给定的字符串

面试题 重复输出一个给定的字符串(str第一个参数)n 次 (num第二个参数),如果第二个参数num不是正数的时候,返回空字符串. function repeatStringNumTimes(str, num) { return str; } repeatStringNumTimes("abc", 3); 提供测试情况: repeatStringNumTimes("*", 3) //应该返回 "***". repeatStringNumTime

用一个集合这么难?

集合   有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否 否 HashSet TreeSet 是(用二叉树排序) Map AbstractMap 否 使用key-value来映射和存储数据,Key必须惟一,value可以重复 HashMap TreeMap 是(用二叉树排序) 目的: 用数组存储数据时只能具有简单的组织形式,而且大小有时候也不确定的需求也无法满足,因此需要具有更多操作的集合来进行数据存储 分类: Vector(矢量) B

HDU 5363 元素为1~n的集合有多少个子集的元素和为偶数-思维-(快速幂取模)

题意:一个集合有元素1~n,求他的子集满足这样的条件:子集的所有元素的和是偶数,问有多少个这样的子集 分析: 一个排列组合问题.元素和为偶数,那么奇数肯定要调偶数个,偶数就无所谓了,所以偶数有2^(n/2)种选法,再乘以奇数有(C((n+1)/2,0)+C((n+1)/2,2).....)种选法,再减一,除去空集,注意,上面取奇数的时候用的是(n+1)/2(这里是向下取整的除法),是综合n为偶数和n为奇数两种情况. 组合数性质:C(n,1)+C(n,3)+....=C(n,2)+C(n,4)+.