LC.P78[子集] 方法一:回溯(选或不选)123456789101112131415161718192021222324class Solution { List<List<Integer>> ans = new ArrayList<>(); List<Integer> path = new ArrayList<>(); int[] nums; public List<List<Integer>> subsets(int[] nums) { this.nums = nums; dfs(0); return ans; } private void dfs(int i) { if (i == nums.length) { ans.add(new ArrayList<>(path)); // 固定答案 return; } dfs(i + 1); // 不选 path.add(nums[i]); // 选 dfs(i + 1); path.remove(path.size() - 1); // 恢复现场 }} 时间复杂度:$O(n2^n)$ 空间复杂度:$O(n)$ 方法二:回溯(选哪个数)12345678910111213141516171819202122class Solution { List<List<Integer>> ans = new ArrayList<>(); List<Integer> path = new ArrayList<>(); int[] nums; public List<List<Integer>> subsets(int[] nums) { this.nums = nums; dfs(0); return ans; } private void dfs(int i) { ans.add(new ArrayList<>(path)); // 固定答案 if (i == nums.length) return; for (int j = i; j < nums.length; ++j) { // 枚举选择的数字 path.add(nums[j]); dfs(j + 1); path.remove(path.size() - 1); // 恢复现场 } }} 时间复杂度:$O(n2^n)$ 空间复杂度:$O(n)$