给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
# 递归写法
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
def f(nums, i): # [0....i-1]已经确定,nums[i]要/不要
if i == len(nums):
res.append(path[:])
return
f(nums, i+1) # 不要nums[i]
path.append(nums[i]) # 要nums[i]
f(nums, i+1)
path.pop() # 回溯时path要删去下一层递归时加入的元素
res = list() # 保存所有子集
path = list() # 保存一个子集
f(nums, 0)
return res
# 使用二进制状态压缩
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
res = list() # 存放所有子集
n = len(nums)
for i in range(2 ** n): # n个元素,每个元素(要/不要)用一个n位的二进制数来表示,1代表要,0代表不要,则从n个0到n个1一共有2^n种情况,用十进制数来表示即为[0...2^n-1]
path = list() # 存放一个子集
for j in range(n): # 将该十进制每一位上的1找到,则该位上元素仅path
if (i >> j) & 1:
path.append(nums[j])
res.append(path)
return res