这里的trick是pathlist的过程,都要加入result
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
def dfs(nums, progress, pathlist, result):
if progress == len(nums):
return
for i in range(progress, len(nums)):
pathlist.append(nums[i])
result.append(pathlist[:])。 # 在这里把过程插入result
dfs(nums, i+1, pathlist, result)
pathlist.pop()
result=[[]]
dfs(nums,0,[],result)
return result
这个不是传统写法。传统写法是遍历多次,每次把长度size的子集找出来。
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
def dfs(size, nums, progress, pathlist, result):
if len(pathlist) == size:
result.append(pathlist[:])
return
for i in range(progress, len(nums)):
pathlist.append(nums[i])
dfs(size, nums, i+1, pathlist, result)
pathlist.pop()
result=[]
for i in range(len(nums)+1):
dfs(i, nums,0,[],result)
return result
还有采用AND binary的每一位的。
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
# use bitmap
result = []
for i in range(2**len(nums)):
tmp = []
for j in range(len(nums)):
if (i>>j)&1 > 0: # 或者写成 (i & 1<<j >0)
tmp.append(nums[j])
result.append(tmp)
return result
还有花花酱搞的一行代码。
https://www.youtube.com/watch?v=CUzm-buvH_8
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
# use bitmap
n = len(nums)
result = [[nums[i] for i in range(n) if s & 1<<i >0] for s in range(1<<n)]
return result