给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums
中的所有元素 互不相同
题解
先来做子集,然后再做子集2,先易后难
迭代
设原序列中元素个数为n,原序列中每个数字的状态有两种:在子集中和不在子集中。这里用1代表在子集中,0表示不在子集中,那么每个子集可以对应一个长度为n的
0/1
序列,第i位表示是否在子集中,例如
n=3
,a={5,2,9}
时:
0/1序列 | 子集 | 0/1序列对应的二进制数 |
---|---|---|
000 | {} | 0 |
001 | {9} | 1 |
010 | {2} | 2 |
011 | {2,9} | 3 |
100 | {5} | 4 |
101 | {5,9} | 5 |
110 | {5,2} | 6 |
111 | {5,2,9} | 7 |
从上面可以发现0/1
序列对应的二进制数恰好从0到,可以枚举
,mask的二进制表示就是一个
0/1
序列,可以按照这个0/1
序列在原集合中取数,当枚举完个mask,也就能构造出所有的子集。