LeetCode全排列问题:回溯算法详解与多语言实现
1. 问题背景与核心挑战LeetCode第46题Permutations是算法学习中的经典排列问题要求给定一个不含重复数字的数组返回所有可能的全排列。这道题在亚马逊、微软等大厂面试中出现频率极高也是理解回溯算法的入门必修案例。我最初接触这个问题时虽然能理解排列的概念但实现时总陷入两个误区一是如何避免重复使用数字二是如何高效地记录已选择的路径。经过二十多次不同解法的尝试和LeetCode周赛的实战检验总结出一套可复用的解题框架。2. 解法思路分析与选择2.1 暴力回溯法DFS路径记录最直观的解法是深度优先搜索配合路径跟踪。就像玩迷宫游戏时用粉笔做标记我们需要维护一个当前路径列表每次选择未被使用的数字加入路径当路径长度等于原数组时记录结果回退并尝试其他选择def permute(nums): res [] def backtrack(path, used): if len(path) len(nums): res.append(path.copy()) return for i in range(len(nums)): if not used[i]: used[i] True path.append(nums[i]) backtrack(path, used) path.pop() used[i] False backtrack([], [False]*len(nums)) return res关键点used数组记录访问状态比判断nums[i] in path更高效O(1) vs O(n)2.2 交换法原地修改更巧妙的解法是通过交换元素位置实现排列类似整理书架时不断调换书籍位置第一个位置依次与所有位置交换固定第一个位置对剩余部分递归处理回溯时恢复交换状态def permute(nums): res [] def backtrack(first0): if first len(nums): res.append(nums.copy()) return for i in range(first, len(nums)): nums[first], nums[i] nums[i], nums[first] backtrack(first 1) nums[first], nums[i] nums[i], nums[first] backtrack() return res复杂度分析时间O(n*n!) 共有n!种排列每次生成需要O(n)时间空间O(n) 递归栈深度为n3. 不同语言实现对比3.1 Java版本注意事项class Solution { public ListListInteger permute(int[] nums) { ListListInteger res new ArrayList(); backtrack(res, nums, new ArrayList(), new boolean[nums.length]); return res; } private void backtrack(ListListInteger res, int[] nums, ListInteger path, boolean[] used) { if(path.size() nums.length) { res.add(new ArrayList(path)); // 必须新建ArrayList return; } for(int i0; inums.length; i) { if(!used[i]) { path.add(nums[i]); used[i] true; backtrack(res, nums, path, used); path.remove(path.size()-1); used[i] false; } } } }Java特别注意添加结果时要new新对象否则会添加引用导致结果被修改3.2 C优化技巧class Solution { public: vectorvectorint permute(vectorint nums) { vectorvectorint res; backtrack(nums, 0, res); return res; } void backtrack(vectorint nums, int start, vectorvectorint res) { if(start nums.size()) { res.push_back(nums); return; } for(int istart; inums.size(); i) { swap(nums[start], nums[i]); backtrack(nums, start1, res); swap(nums[start], nums[i]); } } };C优势vector的swap操作效率极高且不需要额外空间存储used数组4. 常见错误与调试技巧4.1 典型报错案例结果中出现空列表忘记添加终止条件if(len(path)len(nums))递归时错误传递引用res.append(path)应改为res.append(path.copy())排列结果重复输入数组包含重复元素时应先排序本题明确说明无重复used数组标记错误导致数字被重复使用栈溢出缺少递归终止条件数组越界访问常见于交换法中的索引处理4.2 调试方法论打印递归树def backtrack(path, used, depth0): print( *depth fpath{path}, used{used}) # ...其余代码不变小规模测试先测试n2和n3的情况检查结果数量是否为n!个可视化工具使用Python Tutor逐步执行绘制递归调用树形图5. 变种问题拓展5.1 含重复数字的排列LeetCode 47需要先排序然后增加跳过条件if i0 and nums[i]nums[i-1] and not used[i-1]: continue5.2 下一个排列LeetCode 31从后向前找第一个下降点交换适当元素反转后续部分5.3 排列序列LeetCode 60通过阶乘数确定每位数字def getPermutation(n, k): nums list(range(1,n1)) fact [1]*n for i in range(1,n): fact[i] fact[i-1]*i k - 1 res [] for i in range(n-1,-1,-1): idx k // fact[i] res.append(str(nums.pop(idx))) k % fact[i] return .join(res)6. 面试实战要点沟通确认明确输入是否含重复数字询问对空间复杂度的要求代码风格先写函数签名和注释使用有意义的变量名避免单字母测试用例边界情况空数组、单元素数组常规情况[1,2,3]性能测试n840320种排列优化思路讨论迭代实现的可能性考虑用itertools.permutationsPython分析算法限制n10时内存问题我在多次面试中验证过掌握这种系统化的解题方法即使遇到变种题也能快速应对。建议每天用30分钟专门练习排列相关题目坚持两周后会有质的提升。

相关新闻

C语言学习笔记(十三):高级指针——void指针、二级指针与数组指针

C语言学习笔记(十三):高级指针——void指针、二级指针与数组指针

一、void指针1. 什么是void指针?前面学习过:不同类型的指针:int *p;char *p;double *p;只能指向对应类型的数据。例如:int *p;只能保存:int变量地址那么,如果希望一个指针可以保存任意类型的数据地址&#…

2026/10/11 14:52:48 阅读更多 →
【绝密工具包】仅开放72小时:含5款未上架AI学习工具内测邀请码+适配中文语境的微调配置模板

【绝密工具包】仅开放72小时:含5款未上架AI学习工具内测邀请码+适配中文语境的微调配置模板

更多请点击: https://kaifayun.com 第一章:AI学习工具推荐 掌握AI开发离不开高效、开源且社区活跃的学习工具。以下推荐的工具覆盖模型训练、数据处理、可视化与部署全流程,均经过主流开发者验证,适合从入门到进阶的系统性学习。…

2026/10/11 14:53:00 阅读更多 →
嵌入式开发中DMA技术详解:从原理到STM32实战应用

嵌入式开发中DMA技术详解:从原理到STM32实战应用

最近在开发一个需要处理大量数据实时传输的项目时,遇到了一个棘手的问题:如何在不阻塞主线程的情况下,高效、可靠地完成内存与外部设备(如传感器、显示屏)之间的数据搬运。传统的CPU轮询或中断方式在数据量大、频率高时…

2026/10/15 1:59:30 阅读更多 →

最新新闻

iOS卡片堆叠无限滑动实现:布局引擎与交互管道解耦方案

iOS卡片堆叠无限滑动实现:布局引擎与交互管道解耦方案

1. 项目概述:为什么“卡片堆叠无限滑动”成了iOS界面设计的高频刚需你打开一个天气App,手指轻扫,今天、明天、后天的预报像扑克牌一样层层叠叠滑过;你刷一款旅行推荐应用,每张目的地卡片从底部缓缓浮起,滑到…

2026/10/16 4:31:21 阅读更多 →
OpenClaw三平台部署实战:Windows/macOS/Linux完整安装指南

OpenClaw三平台部署实战:Windows/macOS/Linux完整安装指南

OpenClaw 这套环境搭建,我在 2026 年初又把三种主流系统完整跑了一遍。Windows 笔记本、macOS 工作台、还有一台 Linux 服务器,全部从零开始部署,中间踩了不少坑,也整理出一套基本不会再出错的流程。这篇文章就是把这次的实测过程…

2026/10/16 4:31:21 阅读更多 →
STM32嵌入式频谱分析实战:FFT+THD+频谱图全链路实现

STM32嵌入式频谱分析实战:FFT+THD+频谱图全链路实现

简介:本资源是一套基于STM32F103ZET6(正点原子精英版)的嵌入式信号分析实战项目,面向单片机开发初学者与数字信号处理进阶学习者,解决嵌入式端实时FFT频谱分析、THD失真度计算及LCD图形化显示等核心工程问题。压缩包共…

2026/10/16 4:31:21 阅读更多 →
Data Pipeline设计实战:从确定性、可观测性到可演进性

Data Pipeline设计实战:从确定性、可观测性到可演进性

1. 项目概述:这不是“管道”,而是一条数据流动的高速公路“Data Pipeline”这个词,最近在技术社区、招聘JD和内部立项文档里出现频率高得有点反常——但它绝不是什么新造概念,更不是某个厂商包装出来的营销话术。我带过不下二十个…

2026/10/16 4:31:21 阅读更多 →
R语言ggpointdensity密度散点图:解决大数据过绘制问题

R语言ggpointdensity密度散点图:解决大数据过绘制问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 4:31:21 阅读更多 →
从视频自动提取可编辑PPT:OCR识别与版面还原的完整本地方案

从视频自动提取可编辑PPT:OCR识别与版面还原的完整本地方案

上周组会之前,我对着一段将近两小时的学术讲座录像发愁。导师让我把PPT页面整理成汇报材料,这意味着我要反复拖动进度条,暂停、截图、去水印、裁剪,最后把几十张图片按顺序贴进一个新的PPT里。这活儿干了半小时我就想拍桌子&#…

2026/10/16 4:30:21 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →