子集生成
题目:
编写一个方法,返回某集合的所有非空子集(即空集不算)
逐步生成法:
1、假设元素个数为1,
缺少了一些元素,应该从空集开始,每次判断加或不加新的元素,进行分支
子集的生成:选和不选的问题。
使用set集合,集合里面再集合,对于括号来说是在那个位置添加,对子集来说就是加不加
为什么集合遍历时要先克隆?
如果不克隆,那么旧集合选择添加完新元素,新创建的集合里面的值也会被修改,那么选择不加的那种情况就不存在了。
代码:
package Recursion;
import java.util.HashSet;
import java.util.Set;
public class 求集合的子集 {
/***
*@Description 给一个数组,求该数组中的子集
*@Param 数组以及数组的长度
*@Return 包含各个小集合的大集合
*/
public Set<Set<Integer>> qiuziji(int[] arr,int n){
//创建一个结果集合
Set<Set<Integer>> res=new HashSet<>();
//初始化为空集
res.add(new HashSet<>());
//从第一个元素开始遍历数组
for (int i = 0; i <n ; i++) {
//新建一个大集合
Set<Set<Integer>> res_new=new HashSet<>();
//将之前集合中的元素添加到新的集合中,即选择不添加新元素
res_new.addAll(res);
//遍历之前的集合,
for (Set<Integer> set : res) {
//将遍历到的小集合克隆下来,再用克隆下来的集合添加新元素
// (为了防止直接改变原小集合,大集合中的小集合也会变化,即选择不添加的情况失效)
Set clone=(Set)((HashSet)set).clone(); //先强转为hash再转为set
clone.add(arr[i]);
res_new.add(clone); //此时大集合里面包含了选择添加和选择不添加两种情况的集合
}
res=res_new; //更新结果集合
}
return res;
}
}
静态方法调用非静态方法需要new对象,用对象去调用