二进制思想
给n个数,子集共2^n,包括空集,
比如3个数,1,2,3,则共有8个子集
1左移n位表示2的n次方,遍历0到1<<n
用二进制表示每个子集要放入数组的第几个元素,有就对应数位为1,没有则数位为0
000,001,010,011,100,101,110,111
如何判断i的二进制第j位是否为1
i>>j &1 # 右移j位 再 与1
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
res = []
i = 0
while i < 1 << len(nums): # i二进制表示该子集要放入数组哪些索引的数字
now = [] # 当前子集,从空集开始
j = 0
while j < len(nums):
if i >> j & 1: # 若为1,说明i二进制表示数组中的第j个数要放入子集中去
now.append(nums[j])
j += 1
res.append(now)
# print(res)
i += 1
return res