逐步生成法--子集生成

子集生成

题目:
编写一个方法,返回某集合的所有非空子集(即空集不算)

在这里插入图片描述逐步生成法:
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对象,用对象去调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值