贪心算法:为什么每次只做局部最优选择却能得到全局最优解

给定一组活动,每个活动都有开始时间和结束时间,要求选出最多的互不重叠的活动。最直观的思路是尝试所有可能的组合,但这样的时间复杂度是指数级的。如果换一个角度:每次都选择结束时间最早且不与已选活动重叠的活动,只需要一次遍历就能得到最优解。 ...

11 min · 5441 words

单调栈算法:如何用O(n)时间找到下一个更大元素

给定一个长度为100万的数组,要求找出每个元素右侧第一个比它大的元素。最直观的做法是:对每个元素,向右扫描直到找到更大的元素。最坏情况下,每个元素都需要扫描到数组末尾——总的时间复杂度是$O(n^2)$。 ...

11 min · 5232 words

回溯算法:从决策树到剪枝优化的完整LeetCode通关指南

假设你需要生成数组 [1, 2, 3] 的所有排列。最直观的想法是写三重循环,每一层选择一个不同的元素——但如果数组长度是 10 呢?你需要写 10 层嵌套循环。更糟糕的是,如果数组长度不固定呢? ...

12 min · 5987 words

前缀和算法如何用一次预处理换来O(1)区间查询

给定一个长度为100万的数组,需要回答10万次查询——每次查询要求计算某个区间的元素之和。最直观的做法是:对每个查询,遍历从左端点到右端点的所有元素进行累加。假设平均区间长度为50万,总操作次数约为500亿次,在现代CPU上需要运行数秒甚至更久。 ...

9 min · 4439 words

滑动窗口算法:从暴力枚举到线性扫描的效率革命

在一个长度为 100 万的数组中找出连续 k 个元素的最大和。最直观的思路是:对每个可能的起始位置,累加 k 个元素,记录最大值。这需要大约 100 万次循环,每次循环内部还要遍历 k 个元素——总的时间复杂度是 $O(n \times k)$。 ...

11 min · 5044 words

二分查找算法:从十个程序员九个错到LeetCode通关的完整指南

Jon Bentley 在他的经典著作《Programming Pearls》中记录了一个令人震惊的实验结果:在贝尔实验室和 IBM 的课程中,他给专业程序员几个小时的时间实现二分查找,结果超过 90% 的人写出了有 bug 的代码。更令人惊讶的是,二分查找算法首次发表于 1946 年,但第一个正确的实现直到 1962 年才出现——整整 16 年间,这个看似简单的算法一直以"错误"的形式流传。 ...

10 min · 4518 words

双指针算法:从两次遍历到一次扫描的优雅降维

假设你面前有一组从小到大排好序的数字,需要找出其中任意两个数之和等于目标值的组合。最直观的想法是嵌套两层循环,逐一尝试所有配对——时间复杂度 $O(n^2)$,当数据量达到十万级别时,程序开始变得迟缓。 ...

8 min · 3922 words