回溯算法-全排列
回溯本质
解决一个 回溯问题,其实就是一个决策树的遍历问题,需要思考以下3个问题:
- 路径:已经做出的选择
- 选择列表:当前可以做的选择
- 结束条件:到达决策树底层,无法选择
代码框架
res = []
def backtrack(路径,选择列表):
if 满足结束条件:
res.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径,选择列表)
撤销选择
全排列问题
代码实现
class Solution:
def permute(self,nums:List[int]) -> List[List[int]]:
size = len(nums)
ans = []
track = []
# nums:选择列表,track:当前路径
# 选择列表:nums 中不存在于 track 的那些元素
def backtrack(nums,track):
# 所有的数字都填完了,返回一个排列结果
if len(track) == len(nums):
ans.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,track)
return ans