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

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));

    }

}

猜你喜欢

转载自blog.csdn.net/Lotus_dong/article/details/109911981