递归
学习链接:
回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili

python
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
ans = []
path = []
n = len(nums)
def dfs(i):
if i == n:
ans.append(path.copy())
return
dfs(i+1)
path.append(nums[i])
dfs(i+1)
path.pop()
dfs(0)
return ans
可运行下面代码熟悉运算流程:
python
from typing import List
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
ans = []
path = []
n = len(nums)
def dfs(i: int):
# 为了方便看层级,我们用缩进表示我们进入了第几层
indent = " " * i
if i == n:
print(f"{indent}到达终点!拍照存入相册: {path}")
ans.append(path.copy())
return
# --- 动作 A:不选当前数字 ---
print(f"{indent}【不选】数字 {nums[i]},直接前往下一关 dfs({i+1})。目前篮子: {path}")
dfs(i + 1)
# --- 动作 B:选当前数字 ---
path.append(nums[i])
print(f"{indent}【选了】数字 {nums[i]} 放进篮子,前往下一关 dfs({i+1})。目前篮子: {path}")
dfs(i + 1)
# --- 动作 C:恢复现场 ---
removed = path.pop()
print(f"{indent}时光倒流,从篮子里拿出数字 {removed} (恢复现场)。目前篮子: {path}")
# 引擎启动
print("====== 游戏开始 ======")
dfs(0)
return ans
# 运行代码
s = Solution()
result = s.subsets([1, 2, 3])
print("\n最终相册结果:", result)

