给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
思路
方法1:二进制排序(字典排序)
public List<List<Integer>> subsets(int[] nums) {
//1.新建一个集合存储结果
List<List<Integer>> result = new ArrayList<>();
int n = nums.length;
//2.对于0-2^n-1的二进制数;依次生成子集,多生成一位,截掉前面的1
for (int i = (int)Math.pow(2, n); i < (int)Math.pow(2, n + 1); i++) {
String bitmask = Integer.toBinaryString(i).substring(1);
//生成每个子集
List<Integer> cur = new ArrayList<>();
for (int j = 0; j < n; j++) {
if (bitmask.charAt(j) == '1') {
cur.add(nums[j]);
}
}
//3.将生成的子集添加到结果集合中
result.add(cur);
}
return result;
}
时间复杂度:O(n×2^n)
空间复杂度:O(n×2^n)