ALGORITHM COURSES

从一个想法,到一套解法。

每节课都从暴力出发:发现重复工作、建立不变量、逐步执行,最后用自测检验理解。

排序

冒泡排序

Bubble Sort

反复比较相邻元素,把较大的值一步步推向右端。

18 分钟入门O(n2)O(n^2)
排序

插入排序

Insertion Sort

像整理手中的扑克牌,把新元素插入已经有序的前缀。

25 分钟基础O(n2)O(n^2)
排序

归并排序

Merge Sort

先把两半各自排好,再用双指针线性合并。

25 分钟进阶O(nlogn)O(n\log n)
排序

快速排序

Quick Sort

选一个基准,让较小值和较大值分居两边,再递归处理。

25 分钟进阶O(nlogn)O(n\log n)
搜索

二分查找

Binary Search

利用有序性,每次比较中点后排除一半不可能包含答案的区间。

22 分钟基础O(logn)O(\log n)
数组技巧

滑动窗口

Sliding Window

维护一个连续区间,让左右边界只向前移动,从而避免重复扫描。

25 分钟基础O(n)O(n)
图与搜索

广度优先搜索

Breadth-First Search

用队列按距离一层层扩展,先处理离起点更近的节点。

25 分钟基础O(V+E)O(V+E)
图与搜索

深度优先搜索

Depth-First Search

沿一条分支尽可能深入,再回到尚未探索的分支。

25 分钟基础O(V+E)O(V+E)
图与搜索

Dijkstra 最短路

Dijkstra

反复确定当前最近的节点,再用它改善邻居的候选距离。

25 分钟进阶O(V2+E)O(V^2+E)
栈与队列

单调栈

Monotonic Stack

让还没找到答案的元素有序等待,新元素到来时批量解决问题。

25 分钟进阶O(n)O(n)
栈与队列

堆与优先队列

Heap

只维护父子之间的局部顺序,就能快速取得全局极值。

25 分钟进阶O(n)O(n)
图与搜索

并查集

Union Find

通过集合代表快速判断两个节点是否连通,并合并它们所在的集合。

25 分钟进阶O((V+E)α(V))O((V+E)\alpha(V))
动态规划

动态规划入门

Dynamic Programming

把重复出现的子问题只计算一次,再用已知答案构造更大的答案。

30 分钟基础O(n)O(n)