
一、链表
注:由于周赛中的链表题可以转成数组处理,难度比直接处理链表低,故不标明难度分。
带着问题去做下面的题目:
- 在什么情况下,要用到哨兵节点(dummy node)?
- 在什么情况下,循环条件要写
while (node != null)?什么情况下要写while (node.next != null)?
§1.1 遍历链表
- 1290. 二进制链表转整数
- 2058. 找出临界点之间的最小和最大距离
- 2181. 合并零之间的节点
- 725. 分隔链表
- 817. 链表组件
- 3263. 将双链表转换为数组 I(会员题)
- 3294. 将双链表转换为数组 II(会员题)
- 3062. 链表游戏的获胜者(会员题)
- 3063. 链表频率(会员题)
§1.2 删除节点
- 203. 移除链表元素
- 3217. 从链表中移除在数组中存在的节点
- 83. 删除排序链表中的重复元素
- 82. 删除排序链表中的重复元素 II
- 1669. 合并两个链表
- 2487. 从链表中移除节点
- 1836. 从未排序的链表中移除重复元素(会员题)
思维扩展:
§1.3 插入节点
§1.4 反转链表
§1.5 前后指针
§1.6 快慢指针
- 876. 链表的中间结点
- 2095. 删除链表的中间节点
- 234. 回文链表
- 2130. 链表最大孪生和
- 143. 重排链表
- 141. 环形链表
- 142. 环形链表 II
- 457. 环形数组是否存在循环
- 2674. 拆分循环链表(会员题)
思维扩展:
- 287. 寻找重复数
- 1015. 可被 K 整除的最小整数
- 3790. 最小全 1 倍数 同 1015 题
§1.7 双指针
§1.8 合并链表
§1.9 分治
- 23. 合并 K 个升序链表 也可以用堆
- 148. 排序链表
§1.10 综合应用
- 1019. 链表中的下一个更大节点
- 1171. 从链表中删去总和值为零的连续节点
- 707. 设计链表
- 146. LRU 缓存
- 460. LFU 缓存
- 432. 全 O(1) 的数据结构
- 1206. 设计跳表
§1.11 其他
二、二叉树

学习递归,从二叉树开始。
晕递归的同学,请先看视频讲解【基础算法精讲 09】,欢迎点赞~
一般有三种遍历方式:
- 先序遍历:见 §2.2 自顶向下 DFS。
- 中序遍历:见 §2.9 二叉搜索树。
- 后序遍历:见 §2.3 自底向上 DFS。
带着问题去做下面的题目:
- 一般来说,DFS 的递归边界是空节点。在什么情况下,要额外把叶子节点作为递归边界?
- 在什么情况下,DFS 需要有返回值?什么情况下不需要有返回值?
- 在什么情况下,题目更适合用自顶向下的方法解决?什么情况下更适合用自底向上的方法解决?
§2.1 遍历二叉树
- 144. 二叉树的前序遍历
- 94. 二叉树的中序遍历
- 145. 二叉树的后序遍历
- 872. 叶子相似的树 1288
- LCP 44. 开幕式焰火
- 404. 左叶子之和
- 671. 二叉树中第二小的节点
- 1469. 寻找所有的独生节点(会员题)
- 1214. 查找两棵二叉搜索树之和(会员题)
- 2764. 数组是否表示某二叉树的前序遍历(会员题)
§2.2 自顶向下 DFS(先序遍历)
在「递」的过程中维护值。
有些题目自顶向下和自底向上都可以做。有些题目也可以用 BFS 做。
- 104. 二叉树的最大深度
- 111. 二叉树的最小深度
- 112. 路径总和
- 129. 求根节点到叶节点数字之和
- 199. 二叉树的右视图
- 1448. 统计二叉树中好节点的数目 1360
- 1315. 祖父节点值为偶数的节点和 1427
- 988. 从叶结点开始的最小字符串 1429
- 1026. 节点与其祖先之间的最大差值 1446
- 1022. 从根到叶的二进制数之和 1462
- 623. 在二叉树中增加一行
- 1372. 二叉树中的最长交错路径 1713
- 971. 翻转二叉树以匹配先序遍历 1787 有简单做法
- 2689. 从 Rope 树中提取第 K 个字符(会员题)
- 298. 二叉树最长连续序列(会员题)
- 1430. 判断给定的序列是否是二叉树从根到叶的路径(会员题)
- 545. 二叉树的边界(会员题)
§2.3 自底向上 DFS(后序遍历)
在「归」的过程中计算。
- 104. 二叉树的最大深度
- 111. 二叉树的最小深度
- 110. 平衡二叉树
- 965. 单值二叉树 1178
- 2331. 计算布尔二叉树的值 1304
- 100. 相同的树
- 101. 对称二叉树
- 951. 翻转等价二叉树
- 508. 出现次数最多的子树元素和 不使用外部变量
- 563. 二叉树的坡度
- 3997. 统计二叉树中支配节点的数量 1427
- 606. 根据二叉树创建字符串
- 2265. 统计值等于子树平均值的节点数 1473
- 1026. 节点与其祖先之间的最大差值 多种做法
- 3319. 第 K 大的完美二叉子树的大小 1603
- 1339. 分裂二叉树的最大乘积 1675
- 3965. 任务完成时间 I 1699
- 1372. 二叉树中的最长交错路径 1713
- 1145. 二叉树着色游戏 1741
- 572. 另一棵树的子树 做到 时间
- 1530. 好叶子节点对的数量 做到低于 时间
- LCP 67. 装饰树
- 298. 二叉树最长连续序列(会员题)
- 250. 统计同值子树(会员题)
- 1973. 值等于子节点值之和的节点数量(会员题)
- 663. 均匀树划分(会员题)
- 1120. 子树的最大平均值(会员题)
- 2792. 计算足够大的节点数(会员题)
- 333. 最大二叉搜索子树(会员题)
- 366. 寻找二叉树的叶子节点(会员题)
- 156. 上下翻转二叉树(会员题)
- 1612. 检查两棵二叉表达式树是否等价(会员题)
§2.4 自底向上 DFS:删点
- 814. 二叉树剪枝 1380
- 1325. 删除给定值的叶子节点 1407
- 1110. 删点成林 1511
§2.5 有递有归
- 538. 把二叉搜索树转换为累加树 1375 也可以用外部变量记录和
- 1038. 从二叉搜索树到更大和树 同 538 题
- 865. 具有所有最深节点的最小子树 1534 也可以自底向上
- 1080. 根到叶路径上的不足节点 1805
§2.6 二叉树的直径
另见本题单的「§3.5 树的直径」。
§2.7 回溯
§2.8 最近公共祖先
- 235. 二叉搜索树的最近公共祖先
- 236. 二叉树的最近公共祖先
- 1123. 最深叶节点的最近公共祖先 1607
- 2096. 从二叉树一个节点到另一个节点每一步的方向 1805
- 1740. 找到二叉树中的距离(会员题)
- 1644. 二叉树的最近公共祖先 II(会员题)
- 1650. 二叉树的最近公共祖先 III(会员题)
- 1676. 二叉树的最近公共祖先 IV(会员题)
- 1257. 最小公共区域(会员题)思维扩展
§2.9 二叉搜索树
一般是中序遍历。
- 700. 二叉搜索树中的搜索
- 530. 二叉搜索树的最小绝对差 1303
- 783. 二叉搜索树节点最小距离 同 530 题
- 938. 二叉搜索树的范围和 1335
- 501. 二叉搜索树中的众数
- 230. 二叉搜索树中第 K 小的元素
- 98. 验证二叉搜索树 有前序、中序和后序三种做法
- 1305. 两棵二叉搜索树中的所有元素
- 99. 恢复二叉搜索树
- 897. 递增顺序搜索树 1473
- 2476. 二叉搜索树最近节点查询 1597
- 653. 两数之和 IV - 输入二叉搜索树
- 1373. 二叉搜索子树的最大键值和 1914
- 1932. 合并多棵二叉搜索树 2484
- 285. 二叉搜索树中的中序后继(会员题)
- 510. 二叉搜索树中的中序后继 II(会员题)
- 270. 最接近的二叉搜索树值(会员题)
- 272. 最接近的二叉搜索树值 II(会员题)
- 255. 验证二叉搜索树的前序遍历序列(会员题)
- 1902. 给定二叉搜索树的插入顺序求深度(会员题)
§2.10 创建二叉树
- 226. 翻转二叉树 原地
- 617. 合并二叉树 原地
- 108. 将有序数组转换为二叉搜索树
- 654. 最大二叉树
- 998. 最大二叉树 II 1498
- 1008. 前序遍历构造二叉搜索树 1563
- 1382. 将二叉搜索树变平衡
- 2196. 根据描述创建二叉树 1644
- 105. 从前序与中序遍历序列构造二叉树
- 106. 从中序与后序遍历序列构造二叉树
- 889. 根据前序和后序遍历构造二叉树 1732
- 1028. 从先序遍历还原二叉树 1797
- 536. 从字符串生成二叉树(会员题)
- 1628. 设计带解析函数的表达式树(会员题)
- 1597. 根据中缀表达式构造二叉表达式树(会员题)
§2.11 插入/删除节点
§2.12 树形 DP
更多树形 DP,见 动态规划题单 的「十二、树形 DP」。
§2.13 二叉树 BFS
- 102. 二叉树的层序遍历
- 103. 二叉树的锯齿形层序遍历
- 107. 二叉树的层序遍历 II
- 199. 二叉树的右视图 也可以 DFS
- 513. 找树左下角的值
- 515. 在每个树行中找最大值
- 637. 二叉树的层平均值
- 1161. 最大层内元素和 1250
- 993. 二叉树的堂兄弟节点 1288
- 2583. 二叉树中的第 K 大层和 1374
- 1302. 层数最深叶子节点的和 1388
- 2415. 反转二叉树的奇数层 1431
- 1609. 奇偶树 1438
- 623. 在二叉树中增加一行
- 2471. 逐层排序二叉树所需的最少操作数目 1635
- 2641. 二叉树的堂兄弟节点 II 1677
- 919. 完全二叉树插入器 1691
- 958. 二叉树的完全性检验 1703
- 863. 二叉树中所有距离为 K 的结点
- 662. 二叉树最大宽度
- 3157. 找到具有最小和的树的层数(会员题)
- 3831. 二叉搜索树某一层的中位数(会员题)
- 1602. 找到二叉树中最近的右侧节点(会员题)
- 3902. 二叉树的 Z 字形层级和(会员题)
- 742. 二叉树最近的叶节点(会员题)
- 1660. 纠正二叉树(会员题)
§2.14 链表+二叉树
- 114. 二叉树展开为链表
- 1367. 二叉树中的链表 1650
- 109. 有序链表转换二叉搜索树
- 116. 填充每个节点的下一个右侧节点指针 做到 空间
- 117. 填充每个节点的下一个右侧节点指针 II 做到 空间
- 426. 将二叉搜索树转化为排序的双向链表(会员题)
§2.15 N 叉树
- 589. N 叉树的前序遍历
- 590. N 叉树的后序遍历
- 559. N 叉树的最大深度
- 429. N 叉树的层序遍历
- 427. 建立四叉树
- 558. 四叉树交集
- 428. 序列化和反序列化 N 叉树(会员题)
- 1490. 克隆 N 叉树(会员题)
- 1506. 找到 N 叉树的根节点(会员题)
- 1522. N 叉树的直径(会员题)
- 1516. 移动 N 叉树的子树(会员题)
§2.16 其他
- 1379. 找出克隆二叉树中的相同节点
- 1261. 在受污染的二叉树中查找元素 1440
- 1104. 二叉树寻路 1545
- 987. 二叉树的垂序遍历 1676
- 655. 输出二叉树
- 979. 在二叉树中分配硬币 1709 贡献法
- 222. 完全二叉树的节点个数 做到低于 时间
- 297. 二叉树的序列化与反序列化 通信题
- 449. 序列化和反序列化二叉搜索树 通信题
- 331. 验证二叉树的前序序列化
- 652. 寻找重复的子树
- 173. 二叉搜索树迭代器
- 2049. 统计最高分的节点数目 1912
- 2673. 使二叉树所有路径值相等的最小代价 1917
- 2509. 查询树中环的长度 1948
- 2458. 移除子树后的二叉树高度 2299 推荐
- LCP 26. 导航装置
- LCP 60. 力扣泡泡龙
- 314. 二叉树的垂直遍历(会员题)
- 666. 路径总和 IV(会员题)
- 1586. 二叉搜索树迭代器 II(会员题)
- 2773. 特殊二叉树的高度(会员题)
- 1485. 克隆含随机指针的二叉树(会员题)
- 2445. 值为 1 的节点数(会员题)
- 431. 将 N 叉树编码为二叉树(会员题)
- 2005. 斐波那契树的移除子树游戏(会员题)
三、一般树
§3.1 遍历
- 2368. 受限条件下可到达节点的数目 1477
- 1466. 重新规划路线 1634
- 582. 杀掉进程(会员题)
§3.2 自顶向下 DFS
- 4015. 树的加权和 1534
- 1376. 通知所有员工所需的时间 1561
- 3528. 单位转换 I 1580
- 1443. 收集树上所有苹果的最少时间 1683
- 3820. 树上的勾股距离节点 1725
- 1377. T 秒后青蛙的位置 1824
- 3067. 在带权树网络中统计可连接服务器对数目 1909
- 3372. 连接两棵树后最大目标节点数目 I 1927
- 2467. 树上最大得分和路径 2053
- 3373. 连接两棵树后最大目标节点数目 II 2162
- 1766. 互质树 2232
- 2791. 树中可以形成回文的路径数 2677
- 3535. 单位转换 II(会员题)
§3.3 自底向上 DFS
- 690. 员工的重要性
- 3249. 统计好节点的数目 1566
- 1519. 子树中标签相同的节点数 1809
- 3558. 给边赋权值的方案数 I 1845
- 3593. 使叶子路径成本相等的最小增量 1959
- 2872. 可以被 K 整除连通块的最大数目 1968
- 2477. 到达首都的最少油耗 2012
- 3812. 翻转树上最少边 2179
- 2973. 树中每个节点放置的金币数目 2277
- 2440. 创建价值相同的连通块 2460
- 1273. 删除树节点(会员题)
- 3004. 相同颜色的最大子树(会员题)
§3.4 有递有归
- 3593. 使叶子路径成本相等的最小增量 1959 也可以自底向上
- 3331. 修改后子树的大小 2046
§3.5 树的直径
- 2246. 相邻字符不同的最长路径 2126
- 3203. 合并两棵树后的最小直径 2266
- 1617. 统计子树中城市之间最大距离 2309
- 2538. 最大价值和与最小价值和的差值 2398
- 1245. 树的直径(会员题)
- 3787. 查找树的直径端点(会员题)
- 3313. 查找树中最后标记的节点(会员题)
§3.6 树的拓扑排序
- 310. 最小高度树
- 3812. 翻转树上最少边 2179
- 2603. 收集树中金币 2712
§3.7 DFS 时间戳
可以把树上问题转化成数组问题,比如子树的操作转化成子数组的操作。通常要结合其他数据结构。
- 3515. 带权树中的最短路径 2312
- LCP 05. 发 LeetCoin 同 3515 题
- 2322. 从树中删除边的最小分数 2392
- 3327. 判断 DFS 字符串是否是回文串 2454
- 3590. 第 K 小的路径异或和 2646 做法不止一种
§3.8 最近公共祖先(LCA)、倍增算法
带权树 LCA 模板(节点编号从 开始):
Python3
Java
C++
Go
class LcaBinaryLifting:
def __init__(self, edges: List[List[int]]):
n = len(edges) + 1
m = n.bit_length()
g = [[] for _ in range(n)]
for x, y, w in edges:
# 如果题目的节点编号从 1 开始,改成 x-1 和 y-1
g[x].append((y, w))
g[y].append((x, w))
depth = [0] * n
dis = [0] * n # 如果是无权树(边权为 1),dis 可以去掉,用 depth 代替
pa = [[-1] * n for _ in range(m)]
def dfs(x: int, fa: int) -> None:
pa[0][x] = fa
for y, w in g[x]:
if y != fa:
depth[y] = depth[x] + 1
dis[y] = dis[x] + w
dfs(y, x)
dfs(0, -1)
for i in range(m - 1):
for x in range(n):
if (p := pa[i][x]) != -1:
pa[i + 1][x] = pa[i][p]
self.depth = depth
self.dis = dis
self.pa = pa
# 返回 node 的第 k 个祖先节点
# 如果不存在,返回 -1
def get_kth_ancestor(self, node: int, k: int) -> int:
pa = self.pa
for i in range(k.bit_length()):
if k >> i & 1:
node = pa[i][node]
if node < 0:
return -1
return node
# 返回 x 和 y 的最近公共祖先
def get_lca(self, x: int, y: int) -> int:
if self.depth[x] > self.depth[y]:
x, y = y, x
# 使 y 和 x 在同一深度
y = self.get_kth_ancestor(y, self.depth[y] - self.depth[x])
if y == x:
return x
pa = self.pa
for i in range(len(pa) - 1, -1, -1):
px, py = pa[i][x], pa[i][y]
if px != py:
x, y = px, py # 同时往上跳 2**i 步
return pa[0][x]
# 返回 x 到 y 的距离(最短路长度)
def get_dis(self, x: int, y: int) -> int:
return self.dis[x] + self.dis[y] - self.dis[self.get_lca(x, y)] * 2- 1483. 树节点的第 K 个祖先 2115 模板题
- 3559. 给边赋权值的方案数 II 2146
- 3841. 查询树上回文路径 2384
- 3553. 包含给定路径的最小带权子树 II 2411 结论
- 3585. 树中找到带权中位节点 2429
- 2846. 边权重均等查询 2508
- 2646. 最小化旅行的价格总和 树上差分
- 2277. 树中最接近路径的节点(会员题)
- 3973. 通往最近公共祖先的不同门径(会员题)
数组上的倍增:
- 3534. 针对图的路径存在性查询 II 2507
- 2836. 在传球游戏中最大化函数值 2769 做法不止一种
- 3464. 正方形上的点之间的最大距离
§3.9 虚树
- 3786. 树组的交互代价总和 与 无关的做法
§3.10 树上启发式合并
- 2003. 每棵子树内缺失的最小基因值 2415
- 3590. 第 K 小的路径异或和 2646 C++ 需要用 pbds
- 3575. 最大好子树分数 做到
§3.11 点分治
§3.12 树上滑动窗口
- 3425. 最长特殊路径 2435
- 3486. 最长特殊路径 II 2925
§3.13 其他
- 4085. 找到颜色树的根 1879
- 2867. 统计树中的合法路径数目 2428
- 2421. 好路径的数目 2445
- 1719. 重构一棵树的方案数 3018
- 2479. 两个不重叠子树的最大异或值(会员题)
另见 动态规划题单 的「十二、树形 DP」,包含换根 DP。
四、回溯
本质是搜索树上的 DFS。
推荐先完成本题单的 §2.7 节,先理解二叉树上的回溯,再来学习一般情况下的回溯。
§4.1 子集型回溯
有「选或不选」和「枚举选哪个」两种写法。
也可以用二进制枚举做。
- 78. 子集
- 1863. 找出所有子集的异或总和再求和 1372
- 784. 字母大小写全排列
- 3955. 成本限制的有效二进制字符串 1429
- 3566. 等积子集的划分方案 1459
- 2044. 统计按位或能得到最大值的子集数目 1568
- LCP 51. 烹饪料理
- 1774. 最接近目标价格的甜点成本 1702
- 2397. 被列覆盖的最多行数 1719
- 1239. 串联字符串的最大长度 1720
- 3910. 统计节点和为偶数的连通子图 1859
- 2212. 射箭比赛中的最大得分 1869
- 1255. 得分最高的单词集合 1882
- 2151. 基于陈述统计最多好人数 1980
- 2597. 美丽子集的数目 2023
- 2959. 关闭分部的可行集合数目 2077
- 1601. 最多可达成的换楼请求数目 2119
- 1617. 统计子树中城市之间最大距离 2309
- 2174. 通过翻转行或列来去除所有的 1 II(会员题)
- 320. 列举单词的全部缩写(会员题)
- 254. 因子的组合(会员题)
思维扩展:
- 39. 组合总和 同一个数可以重复选
- 2002. 两个回文子序列长度的最大乘积 1869
§4.2 划分型回溯
把分割线(逗号)看成是可以「选或不选」的东西,本质是子集型回溯。
- 131. 分割回文串
- 2698. 求一个整数的惩罚数 1679
- 1593. 拆分字符串使唯一子字符串的数目最大 1740
- 1849. 将字符串拆分为递减的连续值 1747
- 93. 复原 IP 地址
- 140. 单词拆分 II
- 291. 单词规律 II(会员题)
§4.3 组合型回溯
有个数上的约束。也算作子集型回溯。
- 77. 组合
- 216. 组合总和 III
- 1286. 字母组合迭代器 1591
- 22. 括号生成 本质是从 个位置中选 个位置放左括号,剩余 个位置放右括号
§4.4 排列型回溯
部分题目也可以用状压 DP 做。
- 46. 全排列
- 3799. 单词方块 II 1606
- 3376. 破解锁的最少时间 I 1793
- 51. N 皇后 本质是枚举列号的全排列
- 52. N 皇后 II
- 2850. 将石头分散到网格图的最少移动次数 2001
- 1718. 构建字典序最大的可行序列 2080
- 1307. 口算难题 2250
- 37. 解数独
- 3437. 全排列 III(会员题)
- 267. 回文排列 II(会员题)
§4.5 有重复元素的回溯
- 90. 子集 II
- 40. 组合总和 II
- 491. 非递减子序列
- 47. 全排列 II
- 1079. 活字印刷 1741
- 301. 删除无效的括号
- 3646. 下一个特殊回文数 2445
- 2014. 重复 K 次的最长子序列 2558
§4.6 搜索
- 17. 电话号码的字母组合
- 3211. 生成不含相邻零的二进制字符串 1353
- 967. 连续差相同的数字 1433
- 2094. 找出 3 位偶数
- 3483. 不同三位偶数的数目 同 2094 题
- 1415. 长度为 n 的开心字符串中字典序第 k 小的字符串 1576 也有 做法
- 1219. 黄金矿工 1663
- 79. 单词搜索
- 980. 不同路径 III 1830
- 2002. 两个回文子序列长度的最大乘积 1869
- 1255. 得分最高的单词集合 1882
- 3669. K 因数分解 1917
- 756. 金字塔转换矩阵 1990
- 473. 火柴拼正方形 子集分割问题,
- 212. 单词搜索 II
- 638. 大礼包
- 1240. 铺瓷砖 2242
- 679. 24 点游戏
- 282. 给表达式添加运算符
- 126. 单词接龙 II
- 691. 贴纸拼词
- 2056. 棋盘上有效移动组合的数目 2611
- 2386. 找出数组的第 K 大和 2648
- 3509. 最大化交错和为 K 的子序列乘积 2703
- 488. 祖玛游戏
- LCP 58. 积木拼接
- 面试题 17.25. 单词矩阵
- 2664. 巡逻的骑士(会员题)
- 3565. 顺序网格路径覆盖(会员题)
- 247. 中心对称数 II(会员题)
- 248. 中心对称数 III(会员题)
- 411. 最短独占单词缩写(会员题)
- 1088. 易混淆数 II(会员题)
§4.7 折半搜索
英文名 meet in the middle。
讲解(见文末)
- 805. 数组的均值分割 1983
- 494. 目标和
- 3877. 达到目标异或值的最少删除次数
- 3566. 等积子集的划分方案
- 3850. 统计结果等于 K 的序列数目
- 1755. 最接近目标值的子序列和 2364
- 956. 最高的广告牌 2381
- 2035. 将数组分成两个数组并最小化数组和的差 2490
- 3801. 合并有序列表的最小成本 优化
- 3267. 统计近似相等数对 II 优化
- LCP 82. 万灵之树
五、其他递归/分治
- 3537. 填充特殊网格 1542
- 3864. 划分二进制字符串的最小费用 2032
- 1545. 找出第 N 个二进制字符串中的第 K 位 非暴力做法
- 3307. 找出第 K 个字符 II 2232
- 880. 索引处的解码字符串
- 3614. 用特殊操作处理字符串 II
- 932. 漂亮数组 约 2500
手写快排:
- 215. 数组中的第K个最大元素 先做这题再做 912 题
- 912. 排序数组
算法题单
- 滑动窗口与双指针(定长/不定长/单序列/双序列/三指针/分组循环)
- 二分算法(二分答案/最小化最大值/最大化最小值/第K小)
- 单调栈(基础/矩形面积/贡献法/最小字典序)
- 网格图(DFS/BFS/综合应用)
- 位运算(基础/性质/拆位/试填/恒等式/思维)
- 图论算法(DFS/BFS/拓扑排序/基环树/最短路/最小生成树/网络流)
- 动态规划(入门/背包/划分/状态机/区间/状压/数位/数据结构优化/树形/博弈/概率期望)
- 常用数据结构(前缀和/差分/栈/队列/堆/字典树/并查集/树状数组/线段树)
- 数学算法(数论/组合/概率期望/博弈/计算几何/随机算法)
- 贪心与思维(基本贪心策略/反悔/区间/字典序/数学/思维/脑筋急转弯/构造)
- 链表、树与回溯(前后指针/快慢指针/DFS/BFS/直径/LCA)
- 字符串(KMP/Z函数/Manacher/字符串哈希/AC自动机/后缀数组/子序列自动机)
欢迎关注 B站@灵茶山艾府
如果你发现有题目可以补充进来,欢迎评论反馈。
评论 (157)




