思路:运用回溯的思想,每一层都有两个选择,选择该元素或者不选该元素,不选的话,直接进入下一层,选择的话,就将该元素放入list后,进入下一层,但是为了保证不选择该元素的分支存在,需要从list中remove掉该元素。继续进行递归调用。最后当index的值等于数组的长度时,停止递归。将list装入res中。整个递归过程就是一棵二叉树。
public class Subset {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> ans=new ArrayList<>();
if (nums.length==0){
return ans;
}
ArrayList<Integer> list=new ArrayList<>();
dfs(ans,list,nums,0);
return ans;
}
private void dfs(List<List<Integer>> res, List<Integer> temp, int[] nums, int index) {
if (index==nums.length){
res.add(new ArrayList(temp));
return;
}
//不加入当前层的元素直接继续递归;
dfs(res,temp,nums,index+1);
temp.add(nums[index]);//加入当前层的数
dfs(res,temp,nums,index+1);
temp.remove(temp.size()-1);
}
public static void main(String[] args) {
Subset subset=new Subset();
int [] list=new int[3];
for (int i=0;i<3;i++){
list[i]=i+1;
}
System.out.println(subset.subsets(list));
}
}