题目描述
现在有一个没有重复元素的整数集合S,求S的所有子集
注意:
你给出的子集中的元素必须按升序排列
给出的解集中不能出现重复的元素
示例:
输入:[1,2,3]
输出:[[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]
原题链接:集合的所有子集
思路
- 递归:设两个ArrayList存储结果,arr存储每个子集,res存储所有的子集。递归的思路也比较简单,设置一个记录当前步数的变量k,确定当前循环开始的位置,每次递归都要记录当前的子集。
- 每一步:记录当前子集,循环递归和回溯。
- 出口:步数k与数组S的长度相等的时候。
代码
public static ArrayList<ArrayList<Integer>> res;
public static ArrayList<Integer> arr;
public ArrayList<ArrayList<Integer>> subsets(int[] S) {
arr=new ArrayList<>();
res=new ArrayList<>();
res.add(arr);//根据示例,需要添加空集
f(0,S);
return res;
}
private void f(int k,int[] S){
if(k==S.length){
return;
}
for(int i=k;i<S.length;i++){
arr.add(S[i]);//添加新元素进子集
res.add(new ArrayList<>(arr));//添加新的子集到结果
f(i+1,S);//进行当前位置的下一步递归
//注意这里是不重复子集,区分i+1和k+1
arr.remove(arr.size()-1);
//去掉当前元素
}
}