回溯
回溯问题分为子集型、组合型、排列型; 子集型与组合型除了答案的视角(枚举选哪个)还有一种输入的视角(选或不选)
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
ans = []
path = []
n = len(nums)
def dfs(i: int) -> None:
ans.append(path.copy()) # 复制 path
for j in range(i, n): # 枚举选择的数字
path.append(nums[j])
dfs(j + 1)
path.pop() # 恢复现场
dfs(0)
return ans

class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
ans = []
path = []
n = len(nums)
def dfs(i: int) -> None:
if i == n: # 子集构造完毕
ans.append(path.copy()) # 复制 path,也可以写 path[:]
return
# 不选 nums[i]
dfs(i + 1)
# 选 nums[i]
path.append(nums[i])
dfs(i + 1)
path.pop() # 恢复现场
dfs(0)
return ans