1. 题目描述
leetcode46:给定一个不含重复数字的数组
nums,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
分析:这是最典型的回溯问题,我们需要一步一步去选择对应位置的元素,然后撤销选择,接着选择下一个元素,直到所有的元素都被选择了一遍。
解题方法:
def permute(self, nums: List[int]) -> List[List[int]]:
n=len(nums)#数组长度
res=[]#存储结果
def backtrack(first=0):#回溯函数
if first==n:#判断长度是否已经是数组长度n,如果是,就说明遍历完成
res.append(nums[:])
for i in range(first,n):#回溯的过程
nums[i],nums[first]=nums[first],nums[i]#这是一个选择的过程
backtrack(first+1)#回溯
nums[i],nums[first]=nums[first],nums[i]#撤销选择
backtrack()
return res#返回结果
结果如下:
2. 拓展
回溯法解题是有模版的,主要是采用试错的思想,第一步我们随机选择一个变量,看看是否正确,如果不正确,就撤销选择,重选择别的变量。主要有以下3步:
- 选择路径,目前,我选择了哪些路径
- 剩余路径,你还有哪些路径没选过
- 结束条件,什么时候结束选择
根据这道题,我们总结出回溯的模版。
res = []
backtrack(路径,选择列表)
if 满足结束条件:
res.append(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径,选择列表)
撤销选择