子集
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的
子集
(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
1 2
| 输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
|
示例 2:
1 2
| 输入:nums = [0] 输出:[[],[0]]
|
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums
中的所有元素 互不相同
- 从
nums[i]
选还是不选这个角度分析。每一个数都有两种情况,选或不选,所以要把这两种情况都考虑进去。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Solution { List<List<Integer>> res = new ArrayList<>(); List<Integer> list = new ArrayList<>(); int[] nums;
public List<List<Integer>> subsets(int[] nums) { this.nums = nums; dfs(0); return res; }
private void dfs(int i) { if (i == nums.length) { res.add(new ArrayList<>(list)); return; } dfs(i + 1); list.add(nums[i]); dfs(i + 1); list.remove(list.size() - 1); } }
|
- 从答案的视角分析,先确定答案的第
i
位,然后递归确定答案的第i+1
位,i+2
,…n-1
位置
这个方法不如第一个方法好理解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { List<List<Integer>> res = new ArrayList<>(); List<Integer> list = new ArrayList<>(); int[] nums;
public List<List<Integer>> subsets(int[] nums) { this.nums = nums; dfs(0); return res; }
private void dfs(int i) { res.add(new ArrayList<>(list)); for (int j = i; j < nums.length; j++) { list.add(nums[j]); dfs(j + 1); list.remove(list.size() - 1); } } }
|