题目描述:
思路:
递归+回溯
以[1,2,3]举例,详细思路见下图
注意点:
(1)横向:遍历
(2)纵向:递归,递归深度为全排列数组长度
(3)已经出现过在used数组中的元素,直接进行剪枝
(4)当达到递归结束条件时,进行回溯,回到上一层
代码和注释:
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
res = [] # 存放符合条件结果的集合
path = [] # 用来存放符合条件的结果
used = [] # 用来存放已经用过的数字
def backtrack(nums,used):
# 递归结束条件
if len(path) == len(nums):
return res.append(path[:]) # 此时说明找到了一组
for i in range(0,len(nums)):
# used里已经收录的元素,直接跳过
if nums[i] in used:
continue
path.append(nums[i])
used.append(nums[i])
# 进行递归
backtrack(nums,used)
# 开始回溯,回到树的上一层节点
used.pop()
path.pop()
# 调用函数
backtrack(nums,used)
# 返回结果
return res