Input perspective
python3
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
path = []
n = len(nums)
ans = []
def dfs(i):
if i == n:
ans.append(path.copy()) #! copy
return
# 不选 not choose
dfs(i+1)
# choose 选
path.append(nums[i])
dfs(i+1)
path.pop() # 默认弹最后一个元素
dfs(0)
return ans
“答案视角”就是把每一个子集看成一条“答案路径”,路径上的第 1 个节点是子集的第 1 个元素,第 2 个节点是子集的第 2 个元素,以此类推。我们在第 k 层递归里,不再是问“对某个固定的 nums 元素要不要选?”,而是问“子集的第 k 个位置应该放哪个元素?”
i
表示下一步可从原数组 nums
的哪个下标开始选元素
Answer perspective
python3
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
path = []
n = len(nums)
ans = []
def dfs(i):
ans.append(path.copy()) #! copy
if i == n:
return
for j in range(i, n):
#
path.append(nums[j])
dfs(j+1) # j+1
path.pop() # 默认弹最后一个元素 恢复现场
dfs(0)
return ans