题目:给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations
经典回溯算法题目,代码及注释如下:
from typing import List
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
# 定义结果集,临时数组,以及遍历范围
result, tmp, end = [], [], len(nums)
self._dfs(end, tmp, result, nums)
return result
def _dfs(self, end, tmp, result, input_nums):
# 判断元素是否已经足够,若是,则添加进结果集,list是可变对象,需要拷贝一份副本再append
if len(tmp) == len(input_nums):
result.append(list(tmp))
return
for i in range(end):
# 避免与自身重复
if input_nums[i] in tmp:
continue
# 先将当前元素添加到临时数组中
tmp.append(input_nums[i])
# 已当前元素为根,向下递归
self._dfs(end, tmp, result, input_nums)
# 往后退一格,即回溯
tmp.pop()
对于递归不是很熟练的同学,推荐使用pycharm的debug模式,打上断点,一步一步的观察递归栈中变量的变化情况,能提供很好的帮助~