LeetCode热题100--78. 子集
题目
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
题解
class Solution {List<Integer> t = new ArrayList<Integer>();List<List<Integer>> ans = new ArrayList<List<Integer>>();public List<List<Integer>> subsets(int[] nums) {int n = nums.length;for (int mask = 0; mask < (1 << n); ++mask) {t.clear();for (int i = 0; i < n; ++i) {if ((mask & (1 << i)) != 0) {t.add(nums[i]);}}ans.add(new ArrayList<Integer>(t));}return ans;}
}
解析
-
List t = new ArrayList(); 和 List<List> ans = new ArrayList<List>();: 创建两个空的ArrayList,用于存储子集和最终结果。
-
2-6: subsets方法定义了一个循环,遍历所有可能的子集,即从0到2^n(其中n是nums数组的大小)的二进制掩码。对于每一个二进制掩码,它创建一个新的ArrayList t 和副本的新 ans ArrayList。
-
7-11: 这两个for循环遍历nums数组中的每个元素及其对应的二进制位置(mask & (1 << i))。如果在该位置上有值(即与(1 << i)的位运算操作不为0),将nums[i]添加到ArrayList t 中。
-
12: ans.add(new ArrayList(t));: 对于每一个二进制掩码,都将当前子集 t 添加到结果列表 ans 中。这里利用了Java的构造函数去复制一个新的ArrayList来创建一个独立的实例。
-
13: return ans;: for循环结束后,我们得到了所有可能的子集(包括单独的元素和空集合)并将它们存储在ans列表中,最后返回该答案。
