给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

  1. 输入:nums = [1,2,3]
  2. 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

  1. 输入:nums = [0]
  2. 输出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • nums 中的所有元素 互不相同

**

题解

先来做子集,然后再做子集2,先易后难

迭代

设原序列中元素个数为n,原序列中每个数字🥈 78. 子集 - 图1的状态有两种:在子集中和不在子集中。这里用1代表在子集中,0表示不在子集中,那么每个子集可以对应一个长度为n的0/1序列,第i位表示🥈 78. 子集 - 图2是否在子集中,例如n=3a={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到🥈 78. 子集 - 图3,可以枚举🥈 78. 子集 - 图4,mask的二进制表示就是一个0/1序列,可以按照这个0/1序列在原集合中取数,当枚举完🥈 78. 子集 - 图5个mask,也就能构造出所有的子集。