題目:?
兩個方法本質就是決策樹的畫法不同
方法一解析:?
代碼:?
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);//回復現場}}