集合子集(JAVA)

问题描述:

给出一个一维数组,求出其数组的子集。

子集:子集是一个数学概念:如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集。符号语言:若∀a∈A,均有a∈B,则A⊆B。

思路解析:溯其本质,其实子集就是对新元素的加与不加。例如只有一个元素,我们就在空集的基础上,考虑对这个元素进行加或者不加,则可以形成两个集合(一个是空集,一个是这个元素),这个也就是递归出口。所以,要求解某个集合的子集,就要先递归解出其上一层的集合,然后遍历上一层集合中的各个小集合,考虑加与不加,即可求解。

代码如下:

import java.util.HashSet;
import java.util.Set;
public class Zj {
    //求解一个集合的所有子集(归根是上一级元素对新元素的加与不加)
    static Set<Set<Integer>> zj(Integer[]a,int n)
    {
        Set<Set<Integer>> nej=new HashSet<>();//返回的集合声明
        if(n==0)//递归出口
        { Set<Integer> temp1 =new HashSet<>();
          temp1.add(a[n]);
          nej.add(temp1);//加上第一个元素
          Set<Integer> temp =new HashSet<>();
          nej.add(temp);//加上一个空集
          return nej;//返回集合
        }
        Set<Set<Integer>> old=zj(a,n-1);//递归求解出上一层集合
        for (Set<Integer> j:old)//对上一层集合的每一个元素进行加与不加新元素
        {
            nej.add(j);//不加新元素,原始输出
            Set<Integer> clone=(Set<Integer>)((HashSet<Integer>)j).clone();
            clone.add(a[n]);//利用集合克隆体进行加上新元素
            nej.add(clone);
        }
        return nej;
    }
    public static void main(String[] args) {
        Integer []a={1,2,3};
        Set<Set<Integer>> b=zj(a,a.length-1);
        System.out.println(b);
    }
}

要注意集合的克隆。

运行结果如下:
在这里插入图片描述

发布了14 篇原创文章 · 获赞 0 · 访问量 236

猜你喜欢

转载自blog.csdn.net/lianggege88/article/details/105541214
今日推荐