问题描述:
给出一个一维数组,求出其数组的子集。
子集:子集是一个数学概念:如果集合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);
}
}
要注意集合的克隆。
运行结果如下: