解题前先读: 回溯算法解题套路框架
给定一个 没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
题目要求返回给定无重复元素数序列所有可能的全排列,那么就需要穷军所有可能的情况,用回溯法。
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
res = []
l = len(nums)
# nums: 选择列表
# index:当前已有的元素个数
# pre:当前路径
# vis
def backtrack(nums, pre, index = 0):
# if nums == []表示当前选择列表为空,已到达叶子结点
if index == l:
res.append(pre.copy())
return
for i in range(len(nums)):
pre.append(nums[i])
backtrack(nums[:i] + nums[i + 1:], pre, index + 1)
pre.pop()
if nums == []: return []
# 递归函数
backtrack(nums, [], 0)
return res
代码运行流程图:
或者使用一个布尔列表来标记当前元素是否访问过,只有当当前元素未被访问过,才可以加入到路径中。
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
res = []
def backtrack(nums, pre, vis, index = 0):
if index == len(nums):
res.append(pre.copy())
return
for i in range(len(nums)):
if vis[i] == False:
vis[i] = True
pre.append(nums[i])
backtrack(nums, pre, vis, index + 1)
# 回溯
vis[i] = False
pre.pop()
if nums == []: return []
# 定义访问列表,表示访问过的元素就不能再用
vis = [False] * len(nums)
# 递归函数
backtrack(nums, [], vis, 0)
return res