Python小练习系列 Vol.7:全排列生成(回溯算法模板题)
🧠 Python小练习系列 Vol.7:全排列生成(回溯算法模板题)
🔄 本期我们来刷一道“回溯入门必考模板题” —— 全排列。只要搞懂它,很多排列组合类题目就能迎刃而解!
🧩 一、题目描述
给定一个不含重复数字的整数数组 nums
,返回其所有可能的全排列,按任意顺序输出即可。
示例:
输入:nums = [1, 2, 3]
输出:[
[1,2,3], [1,3,2],
[2,1,3], [2,3,1],
[3,1,2], [3,2,1]
]
🧠 二、解题思路
这是经典的 排列问题,适合用回溯算法解决:
- 使用 DFS 构造所有可能的排列路径;
- 使用
used
数组标记当前数字是否已被使用; - 满足排列长度 =
len(nums)
时,即为一个解。
👨💻 三、Python代码实现
def permute(nums):
res = []
path = []
used = [False] * len(nums)
def dfs():
if len(path) == len(nums):
res.append(path[:]) # 拷贝一份结果
return
for i in range(len(nums)):
if not used[i]:
used[i] = True
path.append(nums[i])
dfs()
path.pop()
used[i] = False
dfs()
return res
📌 四、运行示例
print(permute([1, 2, 3]))
输出:
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
🧩 五、解题小结
步骤 | 说明 |
---|---|
路径 path | 当前正在构建的排列 |
选择 used | 标记哪些数字已使用 |
回溯剪枝 | 用完一个数字后恢复现场 |
✅ 回溯三件套:路径、选择列表、终止条件
💡 六、进阶挑战
- 🧠 如果
nums
有重复元素,如何避免重复排列?(提示:先排序 + 跳过相同) - 🚀 输出排列的字典序顺位?
- 📦 支持 k 个数字的排列组合选择?
❤️ 结语
全排列是刷题中回溯法的基本功,掌握它就掌握了“尝试 + 回退 + 去重”的核心思维。
📌 下一期预告:组合总和(回溯 + 剪枝 + 数学)
👉 点赞 👍 + 收藏 🌟,我们下期再见!