Java实现:输出n个元素的所有子集(全详解+图解)

Java代码 专栏收录该内容
11 篇文章 1 订阅

Java实现:输出n个元素的所有子集

解题思路:现有n个元素的集合,先求得(n-1)个元素的所有子集,再将第n个元素加入到之前的所有子集之中,这就实现了求n个元素的子集。

总结一个公式:

n个元素的所有子集 = 第n个元素 +(n-1)个元素的所有子集+ [(n-1个元素的所有子集+第n个元素)] + 空集合

图解:以集合[1,2,3]为例

在这里插入图片描述

代码:

import java.util.ArrayList;

public class SubDemo {
    //定义一个返回能够返回所有元素的子集
    static ArrayList<ArrayList<Integer>> sub(ArrayList<Integer> arr, int index) {
        //声明一个装子集的集合
        ArrayList<ArrayList<Integer>> all = new ArrayList<ArrayList<Integer>>();
        //判断:如果传入的集合长度==传入的元素索引(实质上是要求子集的元素个数),即前面的所有元素都安排完了
        if(arr.size() == index){
            //添加一个空的集合
            all.add(new ArrayList<Integer>());
        }else{
            //递归调用:从索引为0的元素开始将索引增加不断调用
            all = sub(arr, index+1);
            //获得当前索引的元素
            int item = arr.get(index);
            //声明一个装所有(index-1)个元素的所有子集元素+当前索引元素的集合
            ArrayList<ArrayList<Integer>> subsets =  new ArrayList<ArrayList<Integer>>();
            //遍历包含index-1的所有子集和的集合,将其中的子集输出
            for(ArrayList<Integer> s: all){
                //声明一个新的数组来装(index-1)个元素的所有子集元素+当前索引index元素的集合
                ArrayList<Integer> newSubset = new ArrayList<Integer>();
                //先将(index-1)个元素的每一个子集添加到新的集合中
                newSubset.addAll(s);
                //再将index位置的元素添加进去
                newSubset.add(item);
                //最后将新的子集添加到集合subsets中
                subsets.add(newSubset);
            }
            //最后将加入新的元素后的所有子集添加到包含(index-1)个元素的所有子集的集合当中当中
            all.addAll(subsets);
        }
        return all;
    }

    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
            arrayList.add(1);
            arrayList.add(2);
            arrayList.add(3);
            arrayList.add(4);
        System.out.println(arrayList);
        
        System.out.println(sub(arrayList,0));

    }

}
  • 5
    点赞
  • 1
    评论
  • 3
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

月下赶路人

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值