题目描述
题目链接:78. 子集
给你一个整数数组 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
中的所有元素 互不相同
我的题解
方法一:回溯
思路
当前元素选或者不选
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> result = new ArrayList<>(); List<Integer> r = new ArrayList<>(); dfs(result, r, 0, nums); return result; }
private void dfs(List<List<Integer>> result, List<Integer> r, int index, int[] nums) { if (index >= nums.length) { result.add(new ArrayList<>(r)); return; } r.add(nums[index]); dfs(result, r, index + 1, nums); r.remove(r.size() - 1); dfs(result, r, index + 1, nums); } }
|
结果
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:42 MB, 在所有 Java 提交中击败了5.13%的用户
方法二:移位运算
思路
n个集合的子集个数为2^n,因此可以用二进制位来表示当前元素选或者不选。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> result = new ArrayList<>(); int pow = (int) Math.pow(2, nums.length); for (int i = 0; i < pow; i++) { List<Integer> r = new ArrayList<>(); for (int j = 0; j < nums.length; j++) { int t = 1 << j; if ((i & t) == t) { r.add(nums[j]); } } result.add(r); } return result; } }
|
结果
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:41.6 MB, 在所有 Java 提交中击败了44.86%的用户