- 博客(54)
- 收藏
- 关注
原创 别再直接让 AI 写代码了:一套文档驱动的 AI 编程工作流
本文提出了一套文档驱动的AI编程工作流,强调AI编程的核心在于上下文管理而非简单代码生成。作者指出,高效AI开发需要先编写详细文档(需求分析、设计方案等),再将任务拆分为小模块,并为AI提供充分上下文。关键步骤包括:需求分析→技术方案设计→项目结构规划→任务拆分→文档驱动编码→AI代码审查→自动测试生成。文章总结了AI编程五原则:先文档后代码、任务越小越好、提供充分上下文、坚持代码审查、将AI视为团队成员。这套方法将AI定位为架构助手和代码审查者,而非简单代码生成器,可显著提升开发效率和质量。
2026-07-03 11:25:28
418
原创 LeetCode 23. 合并 K 个升序链表(分治 + 链表归并)
本文介绍了LeetCode 23题"合并K个升序链表"的解决方案。最直接的顺序合并方法时间复杂度为O(k²n),效率较低。最优解法采用分治策略,将问题拆分为多个"合并两个有序链表"的子问题,递归合并后得到最终结果。该方法时间复杂度为O(kn×logk),空间复杂度为O(logk)。文章详细讲解了分治思路、合并两个链表的实现、递归拆分过程以及完整代码,并指出了常见错误点如返回值错误、参数类型混淆等。最终解决方案通过分治递归调用mergeTwoLists函数高效合并所有链表。
2026-07-01 13:14:12
301
原创 LeetCode 46. 全排列(回溯算法入门模板)
这篇文章详细介绍了LeetCode 46题「全排列」的回溯解法。主要内容包括: 问题描述:给定无重复数字的数组,返回所有可能的全排列。 解题思路:使用回溯算法(DFS),通过"选择-递归-撤销"的模板枚举所有可能排列。 核心要素: 结果集res存储最终解 路径path记录当前排列 used数组标记已用数字 关键步骤: 终止条件:路径长度等于数组长度 选择未被使用的数字进行递归 回溯时需要恢复状态 常见错误:未正确回溯、保存结果未用副本、终止条件错误等。 复杂度分析:时间复杂度O(n×n!),空间复杂度O(n
2026-06-29 11:35:50
239
原创 LeetCode 5. 最长回文子串——中心扩展法彻底讲透
本文详细讲解了LeetCode第5题"最长回文子串"的中心扩展解法。回文串的核心性质是左右对称,分为奇数长度(如"aba")和偶数长度(如"abba")两种情况。解题思路是:遍历字符串每个位置,分别作为奇数和偶数回文的中心向两边扩展,记录最长回文子串的边界。文章给出了完整Python代码,分析了时间复杂度O(n²)和空间复杂度O(1),并总结了5个常见易错点,如只处理奇数回文、边界处理不当等。关键在于枚举所有可能的回文中心并向外扩展,记录最长回文子串。
2026-06-29 10:36:42
351
原创 LeetCode 98. 验证二叉搜索树(BST)——递归区间法彻底讲透
本文详细讲解了如何验证二叉搜索树(BST)的有效性。关键在于递归维护每个节点的合法取值区间(low, high),确保当前节点值位于区间内,且左右子树分别继承修正后的区间边界(左子树high=当前值,右子树low=当前值)。文章通过图解示例和Python代码演示了该算法,指出常见错误如仅比较父子节点或忽略区间传递,并分析了O(n)时间复杂度和O(h)空间复杂度。最终强调BST验证的核心是检查每个节点是否始终满足祖先节点规定的数值范围约束。
2026-06-26 16:45:31
193
原创 LeetCode 200. 岛屿数量——DFS 连通块模板彻底讲透
本文介绍了使用DFS算法解决LeetCode 200题"岛屿数量"的方法。题目要求统计二维网格中由"1"(陆地)组成的连通块数量。核心思想是:遍历网格时,每发现一个未访问的陆地"1",岛屿计数加1,并通过DFS淹没整个连通区域以防止重复计数。文章详细讲解了DFS模板,包括终止条件(越界或遇到海水)、标记已访问节点和四个方向的递归搜索。提供了完整的Python代码实现,分析了时间复杂度和空间复杂度均为O(m×n)。最后总结了DFS连通块模板的通用性,指出类似问题(如最大岛屿面积、被围绕区域等)均可套用该模板。
2026-06-26 16:44:42
344
原创 LeetCode 24 两两交换链表中的节点(指针重连经典题)
LeetCode 24 两两交换链表节点解题摘要 本题要求在不修改节点值的情况下,通过调整指针两两交换链表中的相邻节点。解题关键在于使用哨兵节点(dummy)统一处理头节点变化,并通过三步指针重连操作完成交换:1)将前驱节点指向第二个节点,2)将第一个节点指向下一组的第一个节点,3)将第二个节点指向第一个节点。每次交换后需要将当前指针移动到已交换组的最后一个节点。时间复杂度O(n),空间复杂度O(1)。易错点包括循环条件判断、指针重连顺序和忘记移动当前指针。核心记忆口诀:"哨兵当头,cur在前;取出两个,三
2026-06-25 14:10:02
204
原创 LeetCode 19 删除链表的倒数第 N 个结点(快慢指针经典题)
本文介绍了LeetCode第19题"删除链表的倒数第N个结点"的解决方案。核心思路是使用快慢指针:快指针先走N步,然后快慢指针同步前进,当快指针到达末尾时,慢指针正好位于待删除节点的前驱位置。为了处理删除头节点的情况,建议使用虚拟头节点(dummy)。文章提供了Python实现代码,分析了时间(O(n))和空间(O(1))复杂度,并指出了常见错误点,如忘记使用dummy节点、快指针步数错误等。最后用一句话总结了该算法的精髓:快指针先走N步,同步前进,慢指针将停在待删除节点的前驱位置。
2026-06-25 13:59:39
242
原创 链表算法题常见解题方法总结(面试高频模板)
文章摘要:链表算法题高频解题方法总结 链表问题的核心在于指针操作,常见解题方法包括: 哨兵节点:通过在链表头部添加虚拟节点统一处理逻辑 快慢指针:通过速度差寻找中点/倒数节点/环检测 指针反转:改变next指向实现链表反转 递归与分治:分解子问题处理链表 解题时可按顺序思考:是否能用哨兵节点→快慢指针→反转→递归→分治。掌握这5种模板方法可解决大多数链表问题。典型题目包括反转链表、删除节点、合并链表、环检测等。
2026-06-25 13:56:06
231
原创 LeetCode 240. 搜索二维矩阵 II,为什么从右上角开始查找?
摘要 LeetCode 240题要求在行列均有序的二维矩阵中高效查找目标值。从右上角开始搜索是关键策略,因为该位置具有"行最大、列最小"的特性,可以每次排除整行或整列:若当前值大于目标,排除当前列(左移);若小于目标,排除当前行(下移)。这种贪心策略使得时间复杂度优化至O(m+n),相比暴力解法的O(m*n)显著提升。特别注意不能从左上角开始,因为无法确定唯一移动方向。实现时需处理空矩阵并正确设置循环条件。
2026-06-24 11:23:07
378
原创 LeetCode 48. 旋转图像,一篇搞懂转置+反转的经典技巧
本文介绍了LeetCode 48题"旋转图像"的解题思路。通过观察发现,顺时针旋转90°可以分解为两个步骤:先对矩阵进行转置(沿主对角线交换元素),再对每一行进行反转。这种方法避免了使用额外空间,满足题目原地修改的要求。文章详细解释了转置时的遍历范围(j从i+1开始)以避免重复交换,并提供了Python实现代码。同时指出了常见错误,如转置区域错误、reverse函数用法不当等。最终复杂度为O(n²)时间,O(1)空间。这种转置+反转的方法是解决矩阵旋转问题的经典技巧。
2026-06-24 11:21:59
417
原创 LeetCode 54. 螺旋矩阵,一篇搞懂边界收缩法
本文介绍了LeetCode 54题"螺旋矩阵"的边界收缩解法。该方法通过维护top、bottom、left、right四条边界,按顺时针方向逐层遍历矩阵元素。每遍历完一条边后收缩对应边界,直到边界相遇为止。文章详细解释了每条边的遍历方式、边界收缩逻辑,并指出了常见错误,如倒序遍历终点设置、边界收缩时机不当等。该方法将螺旋遍历转化为边界管理问题,避免了复杂的模拟方向判断,适用于顺时针、逆时针等各种矩阵遍历场景。最后提供了完整的Python实现代码和关键注意事项。
2026-06-23 16:14:04
234
原创 LeetCode 73. 矩阵置零,从标记数组到 O(1) 空间优化彻底讲透
本文详细讲解了LeetCode 73题"矩阵置零"的两种解法。基础解法使用两个标记数组记录需要清零的行列,空间复杂度为O(m+n)。进阶解法通过复用矩阵的第一行和第一列作为标记区,将空间优化至O(1)。关键点在于:1)避免遍历时直接清零导致的连锁反应;2)预处理保存首行首列原始状态;3)最后单独处理首行首列。文章还总结了三种常见错误:边遍历边置零、未保存首行首列状态、忘记处理首行首列。核心思路是正确处理原始零信息的记录与复用。
2026-06-23 16:12:42
404
原创 LeetCode 238:除自身以外数组的乘积,从暴力枚举到前后缀乘积
这篇文章总结了LeetCode 238题《除自身以外数组的乘积》的解题思路和优化方法。从最直观的O(n²)暴力解法入手,分析其重复计算的问题,进而提出使用前缀积和后缀积来优化到O(n)时间复杂度的双辅助数组解法。进一步优化空间复杂度,通过实时维护右侧乘积变量,将额外空间降至O(1)。文章详细解释了每个步骤的实现原理和边界条件,并总结了常见易错点。这道题的核心价值在于教会我们如何通过预计算消除重复计算,这种思想在数组题、动态规划等场景中广泛应用。
2026-06-22 17:53:24
780
原创 LeetCode 189数组轮转问题详解:辅助数组法与三次翻转法
本文详细解析了LeetCode 189轮转数组问题的两种解法。辅助数组法通过(i+k)%n计算新位置,时间复杂度O(n),空间复杂度O(n),易于理解;三次翻转法通过整体翻转、前k个翻转和剩余部分翻转实现,时间复杂度O(n),空间复杂度O(1),是面试高频解法。建议初学者先掌握辅助数组法,理解轮转规律;面试时优先使用三次翻转法,展现优化思维。两种方法都需要注意k对数组长度取模的处理。
2026-06-22 16:46:23
231
原创 LeetCode 53 最大子数组和:原来动态规划可以这么简单
本文以LeetCode 53题"最大子数组和"为例,揭示动态规划背后的简单逻辑。核心思路是:对于每个数字,只需判断是接上前面的连续子数组更优,还是从当前数字重新开始更优。通过示例数组逐步演示决策过程,最终得出最大和6的连续子数组[4,-1,2,1]。代码实现仅需维护两个变量(当前和与历史最大和),时间复杂度O(n),空间复杂度O(1)。这道题融合了动态规划和贪心的思想,关键在于理解"若前面累计和为负数就舍弃"的简单原则,避免死记硬背公式。
2026-06-18 11:23:01
213
原创 LeetCode 11 盛最多水的容器:从暴力枚举到双指针优化
本文介绍了LeetCode第11题"盛最多水的容器"的解题思路。题目要求在给定柱子高度数组中找到两根柱子,使它们与x轴形成的容器面积最大。作者首先分析了暴力枚举法的时间复杂度为O(n²),并指出其效率不足。随后详细讲解了双指针优化解法:初始化左右指针分别指向数组两端,每次移动较矮的一侧指针,因为移动高柱子不可能增加面积。该方法将时间复杂度优化到O(n)。文章通过示例演示了双指针的运行过程,并强调了理解双指针思想的重要性,这是解决三数之和、接雨水等问题的基础。
2026-06-18 10:45:15
324
原创 LeetCode 121 买卖股票的最佳时机——一文搞懂贪心算法思想
这篇文章介绍了LeetCode 121《买卖股票的最佳时机》的贪心算法解法。题目要求在只能买卖一次的情况下计算最大利润。通过维护历史最低价和当前最大利润两个变量,可以在O(n)时间一次遍历解决问题:对于每天价格,计算当天卖出利润(当前价-历史最低价),并更新最大利润和历史最低价。相比暴力解法的O(n²)复杂度,这种贪心策略更高效,每次只做当前最优选择(以历史最低价买入)。文章详细解析了算法思想、执行过程、代码实现及常见错误,是理解贪心算法的经典入门案例。
2026-06-17 09:12:00
230
原创 LeetCode 20 有效的括号——栈结构入门必刷题
本文详细讲解了LeetCode 20题《有效的括号》的解题思路。该题是栈结构的经典应用,通过后进先出特性解决括号匹配问题。文章分析了为什么要使用栈而非简单计数,介绍了使用字典建立括号映射关系的技巧,并提供了完整的Python代码实现。文中还模拟了代码执行过程,总结了常见错误点(如提前返回、未判空等),并归纳了栈结构的适用场景特征(括号匹配、撤销操作等)。掌握本题后,可进一步挑战栈相关的其他经典题目。解题关键在于:左括号入栈、右括号匹配弹栈、最终检查栈是否为空。
2026-06-16 14:09:35
199
原创 LeetCode 35 搜索插入位置——二分查找入门必刷题
这篇文章介绍了LeetCode第35题"搜索插入位置"的二分查找解法。主要内容包括: 题目分析:在已排序数组中查找目标值的位置或应插入位置,要求O(logn)时间复杂度 解题思路:利用二分查找每次缩小一半搜索区间 标准模板代码实现:使用left<=right循环条件和mid±1边界更新 关键点:最终返回left指针,因为它指向第一个大于等于target的位置 常见错误:mid计算、循环条件、边界更新方向的常见错误 扩展应用:该模板适用于其他二分查找变体问题 这篇文章清晰讲解了二分查找的基本原理和实现细节,特
2026-06-16 14:08:45
223
原创 LeetCode 108 有序数组转平衡二叉搜索树:递归建树模板一次搞懂
刷二叉树的时候,经常会遇到两类题:* 给你一棵树,让你遍历、计算、修改;* 给你一组数据,让你从零构建一棵树。LeetCode 108《将有序数组转换为二叉搜索树》就是第二类题目的经典代表。这道题不仅考察二叉搜索树(BST)的性质,更重要的是让我们掌握一个非常重要的思想:如何利用递归和分治,从零构造一棵树。
2026-06-15 17:40:44
1376
原创 LeetCode 543 二叉树的直径:为什么求深度时顺手就能求出直径?
这篇文章深入解析了LeetCode 543题「二叉树的直径」的解法思路,指出该问题本质上是求二叉树深度的变种。关键点在于:对于任意节点,其直径等于左子树深度加右子树深度,而整棵树的直径就是所有节点中该值的最大值。文章通过分步分析和示例演示,说明了如何在递归计算深度的过程中维护全局最大直径值,并强调了常见错误(如混淆边数与节点数、仅计算根节点等)。最后指出这类问题的通用模式:递归返回一个值(如深度)的同时更新全局答案(如直径),这种思路适用于多种二叉树问题。
2026-06-15 16:53:23
216
原创 二叉树入门必刷 4 题:掌握递归三板斧,搞定 80% 二叉树题目
本文总结了4道经典二叉树题目(中序遍历、最大深度、翻转二叉树、对称二叉树)的核心解法与递归思路。文章指出二叉树题目本质上考察遍历、计算属性、修改结构和判断关系四种模式,并强调了递归三板斧:终止条件、处理左右子树、处理当前节点。文中详细分析了每道题的递归框架、易错点和考察重点,特别提醒要注意空节点判断、指针与值的区别、镜像比较顺序等常见错误。最后提出思考题:为何最大深度不需要辅助函数而中序遍历需要,引导读者深入理解递归应用场景。掌握这四题可解决80%的二叉树问题。
2026-06-12 17:46:14
220
原创 LeetCode 21 合并两个有序链表:彻底理解虚拟头节点(Dummy)套路
本文介绍了LeetCode 21题合并两个有序链表的经典解法——使用虚拟头节点(Dummy Node)技巧。虚拟头节点通过创建一个临时节点作为新链表的起点,统一了头节点处理逻辑,避免了复杂的条件判断。文章详细讲解了迭代法的实现步骤、代码执行过程、边界情况分析和时间复杂度,并总结了虚拟头节点的通用模板和适用场景(合并/删除/反转链表等)。该技巧能显著简化链表操作,减少错误,是解决链表问题的核心方法之一。掌握这一套路后,可以轻松应对多种链表题型。
2026-06-12 09:55:55
251
原创 LeetCode 234 141 链表双指针专题:回文链表与环形链表详解,彻底搞懂快慢指针
本文系统讲解了链表双指针技巧,重点解析了LeetCode 234(回文链表)和141(环形链表)两道经典题目。文章详细介绍了数组转换+双指针、快慢指针+反转链表等解法,深入分析了快慢指针找中点、判环的原理,并总结了链表双指针的三大类型(左右指针、快慢指针、交叉指针)。同时指出了常见易错点,如节点比较、空指针保护等,最后给出了面试解题思路建议。通过这两道高频面试题,读者可以全面掌握链表双指针的核心技巧与应用场景。
2026-06-11 17:58:49
201
原创 LeetCode 160 206 链表入门:相交链表与反转链表,彻底搞懂链表遍历和指针操作
本文通过LeetCode 160(相交链表)和206(反转链表)两道经典题目,系统梳理了链表问题的核心解题技巧。重点讲解双指针法判断相交链表的原理,三指针迭代反转链表的关键步骤,以及哈希集合的空间换时间思路。文章总结链表题常见套路包括:节点引用判断、保存后继节点防断裂、递归反转返回new_head等核心要点。建议初学者掌握双指针、哈希集合和三指针反转这三类基础方法,为后续更复杂的链表题打下坚实基础。
2026-06-11 17:55:01
172
原创 LeetCode 438 找到字符串中所有字母异位词(Python 固定滑动窗口+字符计数解法)
数组职责混淆(最高发错误)基准数组(存p)是标准答案,初始化后绝对不能修改;窗口移动时,仅能修改窗口计数数组,修改基准数组会导致全部判断失效。判断逻辑嵌套错误窗口初始化的for循环内,不要加入数组比对逻辑;必须等整个窗口统计完成后,再执行一次比对,否则会重复记录下标。列表 append 语法错误res.append(数值)(圆括号);res.append[数值](方括号是取值,不能调用方法)。窗口下标公式记错i - len_p;;下标计算错误会导致取到非法字符,程序报错。
2026-06-09 18:00:48
711
原创 Agent Skill 完全指南:从 SKILL.md 到实战开发,打造属于你的 AI 能力插件
AI Agent Skill 开发指南摘要 Skill 是 AI Agent 的可复用能力模块,比传统 Prompt 更结构化。它包含操作流程、资源文件和工具调用能力,能够自动执行复杂任务。本文系统介绍了 Skill 的核心概念、标准目录结构(SKILL.md 是必备文件)、渐进式加载机制以及 5 个编写技巧:1) 优化 description 触发条件;2) 先调研后编写;3) 单一职责原则;4) 优先使用代码指令;5) 记录常见问题。Skill 正在成为 Claude Code、GitHub Copil
2026-06-05 17:26:40
262
原创 [特殊字符] OpenClaw Ubuntu 安装完全指南:在 RK3588 开发板上部署你的私人 AI 助手
🦞 OpenClaw Ubuntu 安装完全指南:在 RK3588 开发板上部署你的私人 AI 助手
2026-06-04 11:24:44
230
原创 # Claude Code 保姆级安装教程:使用 CC-Switch 接入 DeepSeek、Qwen 等国产大模型
摘要 Claude Code是Anthropic推出的命令行AI编程工具,被誉为"终端中的AI工程师",能深度理解项目、执行终端命令并直接修改代码。为解决官方API地域限制和成本问题,推荐使用CC-Switch工具接入国产大模型(DeepSeek、Qwen、GLM等)。安装教程涵盖Node.js环境配置、Claude Code安装、CC-Switch部署及模型接入步骤,特别提供了DeepSeek/Qwen/GLM等国产模型的详细配置指南。文章对比了不同国产模型的适用场景:DeepSeek-V3适合日常开发,
2026-06-03 17:16:08
257
原创 终于搞懂了!Token、1M上下文、KV Cache 和大模型记忆的真相
终于搞懂了!Token、1M上下文、KV Cache 和大模型记忆的真相
2026-06-03 16:42:42
794
原创 RAG 系统踩坑:管理后台删除文档后,客服系统崩了
本文记录了作者在构建RAG智能客服系统时遇到的一个隐蔽bug:通过管理后台删除文档后,客服系统查询会崩溃。问题根源在于管理后台和客服系统作为独立进程各自维护了ChromaDB的内存缓存副本,导致删除操作后出现数据不一致。作者分析发现ChromaDB作为嵌入式数据库会缓存数据,而多进程环境下缓存不会自动同步。最终采用"每次查询重新加载+错误处理兜底"的组合方案解决,虽然增加10-50ms开销但确保了数据一致性。文章还分享了向量数据删除时的格式匹配问题和模糊匹配解决方案,总结了多进程环境下嵌入式数据库缓存机制的
2026-05-29 15:11:28
314
原创 Python基础入门:7大标准数据类型详细讲解(超适合新手)
本文系统介绍了Python中的7大标准数据类型,包括数字(Number)、字符串(String)、布尔(bool)、列表(List)、元组(Tuple)、集合(Set)和字典(Dictionary)。内容涵盖各类型的特点、创建方式、操作方法及使用场景,重点区分了可变类型(List/Dict/Set)与不可变类型(Number/Str/bool/Tuple)的核心差异。文章适合Python初学者系统掌握数据类型基础,为后续学习爬虫、Web开发、AI等领域奠定基础,并提供了代码示例帮助理解内存地址变化等关键概念
2026-05-29 10:14:09
366
原创 LangChain + Gradio 项目部署到 Hugging Face Spaces 踩坑实录(附完整解决方案)
本文记录了将基于LangChain、Gradio等技术的智能客服项目部署到Hugging Face Spaces的完整流程及解决方案。主要分享了创建Space、项目结构设计、关键配置文件编写等步骤,重点解决了三大核心问题:依赖冲突(推荐使用gradio==5.0.0 + huggingface_hub==0.25.2组合)、HfFolder导入失败问题以及容器自动退出问题(必须调用demo.launch())。作者总结指出AI项目最大的挑战在于环境兼容性,并提供了经测试稳定的组件版本组合表。Hugging
2026-05-28 17:17:25
346
原创 RAG 查询优化实战:历史感知改写 + 两步检索,召回率提升 30%
本文介绍了RAG系统中查询优化的实战方案,通过历史感知改写和两步检索显著提升召回率。主要解决三大痛点:用户表述模糊、多轮对话省略主语和单一检索遗漏问题。方案采用LLM改写查询,结合对话历史补充上下文,并设计了两步检索合并策略:先用原始查询检索,再用改写后查询检索,最后合并去重保留最优结果。实验表明该方法能有效提升30%的召回率,同时设计了降级机制保证系统稳定性。文章详细分享了prompt设计、历史格式化方法和合并策略等关键技术细节。
2026-05-26 12:27:35
1208
原创 Query Rewriting(查询重写)详解:RAG 系统中提升检索效果的四大核心方案
本文详细介绍了RAG系统中Query Rewriting(查询重写)的四大核心方案。首先分析了为什么RAG需要查询重写,指出用户原始查询往往存在信息密度低、语义模糊等问题,导致检索效果差。然后阐述了四种主要解决方案:1)LLM查询改写,通过大模型补全语义;2)HyDE技术,生成假设答案再检索;3)查询分解,拆分复杂问题;4)基于规则的改写。文章比较了各方案的优缺点,并针对不同应用场景给出了实施建议,强调查询重写是提升RAG效果的关键模块,有时比优化模型本身更重要。
2026-05-26 10:35:00
382
原创 双层 HITL 架构:为什么你的 AI 客服需要前置规则 + 后置兜底?
这篇文章分享我在实训设备智能客服系统中设计的**双层 HITL 架构**:前置规则拦截 + 后置兜底检测,覆盖 99% 的 HITL 场景。
2026-05-25 15:30:42
372
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅