全排列-LeetCode
46. 全排列 - Permutations
🎯 问题描述(来源于LeetCode)
描述:
给定一个不含重复数字的数组 nums,返回其所有可能的全排列。你可以按任意顺序返回答案。
说明:
- 所有整数互不相同。
- 每个排列是数组中所有元素的一种顺序排列。
示例:
- 示例 1:
1 | 输入: nums = [1,2,3] |
- 示例 2:
1 | 输入: nums = [0,1] |
💻 解题思路
思路:回溯法(DFS) + 标记数组
算法步骤
- 获取数组长度
n,初始化结果列表ans、当前路径列表path和selected布尔数组(标记元素是否已被使用)。 - 定义递归函数
dfs(i),其中i表示当前已选中的元素个数(即path的长度):- 如果
i == n,说明已选中所有元素,将path的副本加入ans并返回。 - 否则,遍历每个元素的下标
j:- 如果
selected[j]为False,则将该元素加入path,标记为已选,递归dfs(i+1),然后回溯:取消标记并弹出元素。
- 如果
- 如果
- 从
dfs(0)开始搜索。 - 返回
ans。
代码实现
1 | from typing import List |
📊 性能分析
- 时间复杂度:,共有 个排列,每个排列复制到结果需要 时间。
- 空间复杂度:,递归栈深度为 ,外加标记数组和路径存储。
思考
该解法是生成全排列的标准回溯模板,通过 selected 数组记录元素是否被使用,确保每个元素在排列中恰好出现一次。
优点:
- 逻辑清晰,易于理解和实现。
- 适用于元素互不重复的场景。
注意事项:
- 遍历时每次循环都扫描整个
selected数组,复杂度为 ?实际每次递归调用都会扫描 个位置,总递归节点数为 (每个排列生成过程中的节点数),因此总时间复杂度为 (复制结果另算),在 时完全可行, 时 ,仍可接受。 - 若
nums中包含重复元素,此方法会产生重复排列,需另外处理(如排序 + 剪枝)。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






