生成非空集合--逐步生成結果_迭代
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<>();// 一個集合巢狀多個集合, 所以要使用Set的addAll方法(把原來存在的多個子集合加進去)
setNew.addAll(set);
for(Set<Integer> setHelp : set){//遍歷之前的集合全部複製一遍,不能夠加到set因為正在遍歷著set
Set<Integer> clone = (Set)((HashSet)(setHelp)).clone();//把當前元素加進去
clone.add(A[i]);//把克隆的集合加入到大集合中
setNew.add(clone);
}
set = setNew;
}
return set;
}
}