二分图匹配为何能用增广路不断扩充:从匈牙利算法到Hopcroft-Karp的完整LeetCode通关指南

三个工人、三份工作,每个人只能胜任其中几份。如何安排才能让最多的人找到工作?这个问题看似简单,却隐藏着图论中最优雅的算法之一——二分图匹配。它不仅能解决工作分配问题,还能处理从课程排期到广告投放的各类实际场景。 ...

8 min · 3686 words

股票买卖问题为何能用一套代码解决所有变体从状态机DP到贪心的统一框架

当你面对LeetCode上的六道股票买卖问题时,第一反应可能是:每道题都要单独学一种解法?这正是无数开发者的误区。实际上,这六道题可以用同一套状态转移方程统一解决——区别只在于边界条件的细微差异。 ...

8 min · 3792 words

差分数组为何能用两次操作完成区间修改从前缀和逆运算到LeetCode完整通关指南

假设有一个长度为10000的数组,需要对区间[100, 5000]内的每个元素都加3,然后再对区间[200, 8000]内的每个元素减5,最后还要对区间[1000, 9000]内的每个元素加10。这样的操作要重复进行1000次,最后输出最终结果。 ...

10 min · 4610 words

扫描线算法如何将二维问题降维成一维从天际线到矩形面积的LeetCode完整通关指南

扫描线算法是计算几何中最优雅的算法范式之一。它的核心思想简单得令人惊讶:用一条假想的线扫过整个平面,只在关键点停下来处理。这个朴素的想法却催生了计算复杂度理论的重大突破。1976年,Michael Shamos 和 Dan Hoey 发表了标志性的线段相交检测算法,证明了扫描线结合平衡二叉树可以在 $O(N \log N)$ 时间内判断 $N$ 条线段是否存在交点——这在当时是革命性的结果。随后,Bentley 和 Ottmann 将其扩展为报告所有交点的算法,Fortune 在 1986 年用扫描线构造 Voronoi 图,这些工作奠定了计算几何作为独立学科的基础。 ...

10 min · 4874 words

最长公共子序列为何能解决十几类LeetCode问题从字符串相似度到DNA比对的动态规划精髓

每次你在终端输入 git diff,后台都在运行一个你可能刷过无数次的算法题——最长公共子序列。这不是巧合,而是计算机科学中最优雅的算法之一在实际工程中的自然落地。从版本控制到生物信息学,从拼写检查到数据压缩,LCS 找到了两个序列之间"最相似的部分",而这个看似简单的问题背后,隐藏着动态规划的精髓。 ...

10 min · 4739 words

字符串哈希如何用O(1)时间判断两个子串是否相等

一个看似简单的问题 给你一个字符串"abcdefg",现在需要判断子串s[1:4]和子串s[3:6]是否相等。你会怎么做? 最直观的方法是逐字符比较:遍历两个子串的每个字符,逐一对比。对于长度为k的子串,这需要O(k)的时间复杂度。当子串较长或者需要进行大量比较时,这种方法的性能瓶颈就会暴露出来。 ...

11 min · 5036 words

博弈论算法为何能用数学公式预测胜负从Nim博弈到极大极小算法的完整LeetCode通关指南

1901年,哈佛大学教授Charles L. Bouton在《数学年鉴》上发表了一篇论文,题为"Nim, A Game with a Complete Mathematical Theory"。这篇论文揭示了一个令人震惊的事实:一种看似需要随机应变的策略游戏,竟然可以用一个简单的数学公式完全预测胜负。这个公式就是——异或和(XOR sum)。 ...

11 min · 5129 words