求集合子集

    xiaoxiao2022-06-25  316

    求子集

    递归调用法

    java源码

    import java.util.HashSet; import java.util.Set; public class ZiJi { public static Set<Set<Integer>> ziJi(int []a,int k){ Set<Set<Integer>> newSet=new HashSet<Set<Integer>>(); if(k==0){//第一个元素,加或不加两种情况 //不加 Set<Integer> temp=new HashSet<Integer>(); //加 Set<Integer> temp2=new HashSet<Integer>(); temp2.add(a[0]); //将两种情况加入集合 newSet.add(temp); newSet.add(temp2); return newSet; } //获取上层元素集合 Set<Set<Integer>> oldSet=ziJi(a,k-1); for(Set<Integer> i:oldSet){//对上层的每个元素 //不加元素分支 newSet.add(i); //加元素分支 Set<Integer> temp=new HashSet<Integer>(); temp.addAll(i); temp.add(a[k]); newSet.add(temp); } return newSet; } public static void main(String[] args) { int []a={1,2,3}; Set<Set<Integer>> s=ziJi(a,a.length-1); System.out.println(s); } }

    运行结果

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

    巧用二进制法

    核心思想:对于一个含有N个元素的集合的子集个数可以计算得到共有 2 N 2^N 2N个 所以用(0—— 2 N 2^N 2N-1)的2进制来表示对N个元素的选与不选(0表示不选,1表示选) 如:对于3个元素的集合,1 写成二进制 001——表示就是前两个不选,最后一个选。

    java源码:

    public static void main(String[] args) { char []a={'a','b','c'}; for(int i=0;i<Math.pow(2, a.length);i++){ int temp=i; for(int j=0;j<a.length;j++){ if((temp&1)==1){ System.out.print(a[j]); } temp=temp>>1; } System.out.println(); } }

    运行结果

    a b ab c ac bc abc

    最新回复(0)