题目:

两个方法本质就是决策树的画法不同
方法一解析:

代码:
class Solution {
private List<List<Integer>> ret;//返回结果
private List<Integer> path;//记录路径,注意返回现场
public List<List<Integer>> subsets(int[] nums) {
path = new ArrayList<>();
ret = new ArrayList<>();
dfs(nums,0);
return ret;
}
//i表示选择到了那一层
private void dfs(int[] nums, int indx){
//递归出口
if(indx == nums.length){
ret.add(new ArrayList<>(path));
return;
}
//选某个元素
path.add(nums[indx]);
dfs(nums,indx+1);
path.remove(path.size()-1);//回复现场
//不选某个元素
dfs(nums,indx+1);
}
}方法二解析:

代码:
private List<List<Integer>> ret;//返回结果
private List<Integer> path;//记录路径
public List<List<Integer>> subsets(int[] nums) {
path = new ArrayList<>();
ret = new ArrayList<>();
dfs(nums,0);
return ret;
}
private void dfs(int[] nums, int pos){
ret.add(new ArrayList<>(path));
for(int i = pos; i < nums.length; i++){
path.add(nums[i]);
//每一层只能往选过的元素,再往选
dfs(nums,i+1);
path.remove(path.size()-1);//回复现场
}
}