回溯算法的框架
回溯算法由路径、选择列表、结束条件构成,解决一个回溯问题,实际上是在对一个决策树进行遍历。
- 路径:已经选择的历史
- 选择列表:选择的空间
- 结束条件:到达决策树底层,无法继续选择
res = [] # 最终结果
def backtrack(路径, 选择列表):
if 结束条件:
res.add(路径)
return
for 选择 in 选择列表:
做选择 # 路径.add(选择) or continue
backtrack(路径, 选择列表)
撤销选择
全排列生成问题
全排列的生成算法方法是将给定的序列中所有可能的全排列无重复无遗漏地枚举出来。
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
代码实现
# 路径:记录在 track 中
# 选择列表:nums 中不存在于 track 的那些元素
# 结束条件:nums 中的元素全都在 track 中出现
def solve(nums):
res = []
def backtrack(nums, track):
# 触发结束条件
if(len(track) == len(nums)):
res.append(track[:]) # [:]
return
for i in range(len(nums)):
# 做选择,是否进行选择
if nums[i] in track:
continue
track.append(nums[i])
backtrack(nums, track)
track.pop()
backtrack(nums, [])
return(res)