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