welcome.md
滑动窗口

两个指针 lr,r 一路往右扩;窗口”违法”了就 l 往右收,合法了就更新答案。两个指针各自最多走 N 步, 砸穿 的暴力枚举。

...
双指针技巧

一句话: 用两个指针的相对运动,把 暴力压成 之所以能压,是因为问题里藏着单调性 — 移动一个指针让”目标”单调变化,所以根本不需要回头。

...
贪心算法

每步选当前看起来最优的,寄希望于全局最优。难点不在写代码,在于证明这一步贪是对的。

...
差分数组与前缀和

差分数组 = 前缀和的逆运算。区间 [l, r] += k 这种 的活,改成两次单点改 diff[l] += k; diff[r+1] -= k, 搞定。最后再做一遍前缀和还原。记住这一句,这辈子的区间批量加都不会再写循环。

...
树形 DP

一句话: DFS 一遍, 每个节点的答案 = 子树聚合 + 自己的贡献。本质是后序遍历 + 状态在节点上传递, 自底向上 return。

...
区间 DP

状态 dp[i][j] 是一段区间的最优答案,转移枚举区间内的”分割点” k。关键不是公式,而是枚举顺序: 必须从短区间到长区间,因为 dp[i][j] 要先有 dp[i][k]dp[k+1][j] 才算得出来。记住这一句,石子合并、戳气球、矩阵链乘就是同一道题。

...
动态规划

DP = 子问题 + 不重复计算。把指数级搜索压成多项式,全靠”算过的别再算”。

...
Trie 前缀树

每个节点存一个字符,从根到叶的路径就是一个完整字符串。共同前缀的字符串共用前面的节点 — 这就是为什么叫”前缀树”。插入/查询都是 ,跟字典里有多少词无关。

...
拓扑排序 Topological Sort

DAG 里给所有节点排个序,使得每条边都从靠前的指向靠后的。两种实现各背一份:Kahn 算法(BFS 入度法)和 DFS 后序逆序。顺手就把环检测做了。

...
Dijkstra 最短路径算法

Dijkstra = BFS + 贪心。把 FIFO 队列换成优先队列,每次从未确定的节点里挑距离最小的那个去松弛邻居。前提:边权非负——因为已确定节点的距离一旦敲定就不再回头。

...