1. 问题描述:
请编写一个方法,返回某集合的所有非空子集。
给定一个int数组A和数组的大小int n,请返回A的所有非空子集。
保证A的元素个数小于等于20,且元素互异
2. 思路分析:
除了使用递归的方法还可以使用迭代的方法来解决,先创建存储集合的数据结构Set<Set<Integer>set并且进行初始化把第一个元素初始化为空集,然后通过for循环遍历这个集合,然后在for中创建一个新的Set<Set<Integer> setNew用来存储原来已经存在的集合,for循环遍历的是原来就已经存在的集合set , 然后往当前原来的集合添加当前元素,然后把它添加到setNew集合里面,然后把当前最新的元素集合赋值给set,方便下一次进行遍历添加元素(在for循环中新建一个setNew中是为了辅助作用因为不可能边遍历边向集合中添加元素的)
其中使用到了一个集合加入多个集合,所以要使用Set的addAll方法
3. 具体的代码如下:
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int A[] = new int[n];
for(int i = 0; i < n; i++){
A[i] = sc.nextInt();
}
Set<Set<Integer>> set = solve(A, n);
for(Set<Integer> set1 : set){
if(set1.size() == 0){
set.remove(set1);
break;
}
}
System.out.println(set);
}
private static Set<Set<Integer>> solve(int[] A, int n) {
Set<Set<Integer>> set = new HashSet<>();
//初始化为空集
set.add(new HashSet<>());
for(int i = 0; i < n; i++){
//新建一个大集合
Set<Set<Integer>> setNew = new HashSet<>();
//把原来存在的多个子集合加进去
setNew.addAll(set);
//遍历之前的集合全部复制一遍,不能够加到set因为正在遍历着set
for(Set<Integer> setHelp : set){
Set<Integer> clone = (Set)((HashSet)(setHelp)).clone();
//把当前元素加进去
clone.add(A[i]);
//把克隆的集合加入到大集合中
setNew.add(clone);
}
set = setNew;
}
return set;
}
}