未分类

【题单】常用数据结构(前缀和/差分/栈/队列/堆/字典树/并查集/树状数组/线段树)

nkul · 6月24日 · 2024年 519次已读

题目已按照难度分排序,右侧数字为难度分。

如果遇到难度很大,题解都看不懂的题目,建议直接跳过,二刷的时候再来尝试。

数据结构题单数据结构入门数据结构新手教程数据结构题目力扣数据结构leetcode数据结构 灵茶山艾府 灵神

零、常用技巧

对于 双变量问题,例如两数之和 ai+aj=ta_i+a_j=tai​+aj​=t,可以枚举右边的 aja_jaj​,转换成 单变量问题,也就是查找在 aja_jaj​ 左边是否有 ai=t−aja_i = t-a_jai​=t−aj​,这可以用哈希表维护。

我把这个技巧叫做 枚举右,维护左

讲解

一、前缀和

§1.1 基础

讲解

§1.2 前缀和与哈希表

讲解

§1.3 距离和

图解

§1.4 前缀异或和

§1.5 其它一维前缀和

§1.6 二维前缀和

【图解】一张图秒懂二维前缀和!

二维前缀最小值:

二、差分

§2.1 一维差分(扫描线)

原理讲解(推荐和【图解】从一维差分到二维差分 一起看)

§2.2 二维差分

【图解】从一维差分到二维差分

三、栈

§3.1 基础

§3.2 进阶

§3.3 邻项消除

§3.4 合法括号字符串

注:部分题目可以不用栈,而是用一个数字记录嵌套深度。

§3.5 表达式解析

§3.6 对顶栈

§3.7 单调栈

单调栈题单

四、队列

队列常用在 BFS 中,见 网格图题单图论题单。与此相比,栈常用在 DFS 中,但无需我们手动维护。

§4.1 基础

§4.2 设计

§4.3 单调队列

个人觉得叫单调双端队列更准确。

原理讲解

§4.4 单调队列优化 DP

一般用来维护一段转移来源的最值。

  1. 前提:区间右端点变大时,左端点也在变大(同滑动窗口)。
  2. 转移前,去掉队首无用数据。
  3. 计算转移(直接从队首转移)。
  4. 把数据(一般是 f[i]f[i]f[i])插入队尾前,去掉队尾无用数据。

五、堆(优先队列)

§5.1 基础

§5.2 进阶

§5.3 重排元素

§5.4 第 K 小/大

部分题目也可以用二分解决。

§5.5 反悔堆

基于堆的反悔贪心。

§5.6 懒删除堆

§5.7 对顶堆

另见 图论题单 中的 Dijkstra 算法。

六、字典树(trie)

§6.1 基础

§6.2 进阶

§6.3 字典树优化 DP

§6.4 0-1 字典树(异或字典树)

部分题目也可以用试填法解决。

七、并查集

§7.1 基础

网格图题单 中的 DFS 和 图论题单 中的 DFS,其中大部分题目可以用并查集实现。

§7.2 进阶

§7.3 公因数并查集

§7.4 数组上的并查集

§7.5 区间并查集

§7.6 边权并查集

八、树状数组和线段树

能用树状数组解决的题目,也能用线段树解决(反过来不一定)。但树状数组实现简单,代码短。

为方便大家练习,我把适合用树状数组解决的题目分到树状数组中,其余分到线段树中。

§8.1 树状数组

讲解:带你发明树状数组!附数学证明

§8.2 逆序对

除了可以用树状数组解决,部分题目也可以在归并排序的同时计算。

§8.3 线段树(无区间更新)

§8.4 Lazy 线段树(有区间更新)

§8.5 动态开点线段树

部分题目也可以用珂朵莉树解决。

专题:离线算法

对询问排序,通过改变回答询问的顺序,使问题更容易处理。

相应的,在线算法就是按照输入的顺序处理,来一个就处理一个。

分类题单

以下题单没有特定的顺序,可以按照个人喜好刷题。

  1. 滑动窗口(定长/不定长/多指针)
  2. 二分算法(二分答案/最小化最大值/最大化最小值/第K小)
  3. 单调栈(基础/矩形面积/贡献法/最小字典序)
  4. 网格图(DFS/BFS/综合应用)
  5. 位运算(基础/性质/拆位/试填/恒等式/贪心/脑筋急转弯)
  6. 图论算法(DFS/BFS/拓扑排序/最短路/最小生成树/二分图/基环树/欧拉路径)
  7. 动态规划(入门/背包/状态机/划分/区间/状压/数位/数据结构优化/树形/博弈/概率期望)
  8. 常用数据结构(前缀和/差分/栈/队列/堆/字典树/并查集/树状数组/线段树)
  9. 数学算法(数论/组合/概率期望/博弈/计算几何/随机算法)

我的题解精选(已分类)

欢迎关注 B站@灵茶山艾府

制作不易,欢迎点赞,转发给你的朋友和刷题群!

相关文章
暂无相关文章!
0 条回应