cmm✨ 的算法小课堂
文字、代码、动画三者同步联动。每一步都能停下来看清楚—— 数据怎么变、代码走到哪、为什么这一步是这一步。
相邻比较与交换,最直观的入门。
每轮挑出最小值,放到未排序区间开头。
维护左侧有序区间,把新元素插入正确位置。
分而治之,稳定的对数级排序。
pivot 与分区,平均情况下最快。
建堆后反复取最大值放到末尾 — 最坏 O(n log n) 且就地。
在有序数组里区间折半。
从左到右逐个检查,适用于未排序数组。
在网格上一圈圈扩散,找最短路径。
一头扎到底再回溯,蛇形探索。
带权图的最短路:贪心 + 松弛。
快速合并集合、查询是否同组。
Kahn 算法:按依赖关系把 DAG 排成线性顺序。
指针重连最经典的演示 — prev/cur/next 三个指针的舞蹈。
双指针比较,依次接到结果链表后面。
Floyd 龟兔赛跑 — 有环必相遇。
最小堆 — 数组与树双视图。
用栈检查括号是否正确闭合。
前 / 中 / 后序,同一棵树看顺序差异。
插入 / 查找 / 删除三件套,含两子删除的中序后继。
贪心合并最小两棵 — 高频字符配短码的经典前缀码。
经典 DP 入门:dp[i] 的设计与回溯。
Kadane 算法:局部最优滚动成全局最优。
给定面额,用最少的硬币凑出目标金额。
把一个字符串变成另一个,最少需要多少次增删改。
每件物品要么拿要么不拿,最大化总价值。
每件物品可以无限次使用 — 跟 0/1 只差一行。
自底向上递推,理解 DP 的最简起点。
用单调队列在 O(n) 时间内求每个窗口的最大值。
“下一个更大元素”的经典套路。
预处理换查询:区间求和 O(1),区间加法 O(1)。
逐行放皇后 + 列/对角线剪枝 — 回溯算法的代表题。
一次划掉所有合数,剩下的就是素数。
每个合数只被它的最小质因子划一次,做到真正 O(n)。
用指数的二进制把 a^n 算到 O(log n)。
欧几里得算法:反复取余直到余数为 0。