深度优先遍历
- 每个位置要or不要,构成一颗树,到达最底部收集答案

public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> ans = new ArrayList<>(); LinkedList path = new LinkedList(); process(nums, 0, ans, path); return ans;} /* 当前来到index位置,做决定 1) 要当前位置的数 2)不要当前位置的数 如果要当前位置的数, 把该数字,放入到path中去, 如果不要当前位置的数, 不放入path中 */private void process(int[] nums, int index, List<List<Integer>> ans, LinkedList path) { if (index == nums.length) { ans.add(copy(path)); } else { // 要当前这个数 path.add(nums[index]); process(nums, index + 1, ans, path); // 恢复现场 path.removeLast(); // 不要当前这个数 process(nums, index + 1, ans, path); }}private ArrayList<Integer> copy(LinkedList<Integer> path) { ArrayList<Integer> ans = new ArrayList<>(); for (Integer num : path) { ans.add(num); } return ans;}