最短路径算法为何如此重要从Dijkstra到Floyd的四种实现方式与LeetCode完整通关指南

1956年的某个早晨,荷兰计算机科学家艾兹赫尔·戴克斯特拉(Edsger W. Dijkstra)在阿姆斯特丹的一家咖啡馆里,只用20分钟就在脑海中设计出了最短路径算法。当时他正在和未婚妻逛街,甚至没有用纸笔——这个"20分钟的发明"后来成为计算机科学史上最著名的算法之一,被广泛应用于GPS导航、网络路由、社交网络分析等无数领域。 ...

14 min · 6744 words

二叉树遍历为何如此重要:从递归到Morris的四种实现方式与LeetCode完整通关指南

当你面对一棵表达式树 (1 + 2) * 3 时,不同的遍历顺序会得到完全不同的结果:前序遍历产生前缀表达式 * + 1 2 3,中序遍历还原原始表达式 1 + 2 * 3(需要括号),后序遍历产生后缀表达式 1 2 + 3 *——这正是逆波兰表示法,可以直接用于栈式计算器。这就是二叉树遍历的核心价值:遍历顺序决定了数据的处理方式。 ...

7 min · 3503 words

线段树:如何在O(log n)时间内完成任意区间查询与更新

假设你正在开发一个实时数据分析平台,需要频繁执行两类操作:查询某个时间段内的数据总和,以及更新某个时间点的数值。如果用普通数组,查询需要 $O(n)$ 时间遍历整个区间;如果用前缀和数组,查询确实降到了 $O(1)$,但每次更新又需要 $O(n)$ 时间重新计算前缀。当数据量达到百万级别、操作频率达到每秒数千次时,这两种方案都无法满足性能要求。 ...

10 min · 4653 words

拓扑排序如何让任务有条不紊地执行:从Kahn算法到DFS的完整LeetCode通关指南

在大型软件项目的构建过程中,模块之间存在复杂的依赖关系:A模块依赖B模块,B模块又依赖C模块。构建系统必须找到一个合法的编译顺序,确保每个模块在其依赖项编译完成后才开始编译。这个问题的数学本质就是拓扑排序——给定一个有向无环图(DAG),找到一个线性序列,使得对于每条有向边$u \to v$,顶点$u$都出现在顶点$v$之前。 ...

9 min · 4456 words

为什么把问题拆开反而更快?分治算法从主定理到LeetCode完整指南

假设要在一百万个有序数字中找到某个特定值,最直接的想法是从头到尾逐个检查——运气好第一个就是,运气不好要找一百万次。但如果每次都将搜索范围缩小一半,最多只需要20次就能确定结果。这种"分而治之"的智慧,不仅让二分查找成为效率典范,更催生了归并排序、快速选择、Strassen矩阵乘法等一系列经典算法。 ...

10 min · 4726 words

字典树(Trie):用共享前缀把字符串检索从O(n)降到O(L)

假设你在搜索引擎输入框里键入"goog",下拉列表立刻弹出"google"、“google maps”、“google translate"等一系列建议。这些结果是怎么在毫秒级时间内出现的?如果用哈希表存储所有可能的搜索词,每次按键都需要遍历整个哈希表来找出以当前输入为前缀的词——当词库达到百万级别时,这种做法显然不可行。 ...

12 min · 5578 words

并查集:从社交网络连通性到LeetCode通关的完整指南

假设你正在开发一个社交网络应用,需要实时回答"用户A和用户B是否在同一个社交圈内"这类查询——用户之间可以通过好友关系不断形成更大的圈子。每添加一个好友关系,圈子就可能合并;每查询一次,就需要判断两个用户是否已经连通。如果用传统的图遍历方法,每次查询都可能需要遍历整个图,当用户量达到百万级别时,系统会变得极其缓慢。 ...

10 min · 4550 words