1.单调栈
单调栈就是具有单调性的栈,这个栈里面的数据要么是递增要么是递减的
应用场景:
求与目标元素距离最近的比他大/小的值的位置
具体可分为:
1.目标左侧,距离最近,比他大(降序单调栈)
2.目标左侧,距离最近,比他小(升序单调栈)
3.目标右侧,距离最近,比他大
4.目标右侧,距离最近,比他小
第三第四条只需要从顺序遍历数组变为逆序遍历数组,然后分别使用1,2的策略即可
例题:
2.单调队列
是一个具有单调性的双端队列
应用场景:解决滑动窗口内最值问题,优化动态规划
例题:
3.并查集
**树的双亲表示法:**就是使用数组记录当前索引表示的节点的父节点索引
**并查集:**是一个森林结构,每棵树表示一个集合,集合内每个节点表示一个元素,使用根节点表示整个集合
**应用场景:**维护一个集合,该集合要频繁进行集合内数据查询,集合合并
3.1并查集实现
(1)初始化:
让所有节点都自成集合,并查集数组都自己存储自己的索引
(2)查询:
使用递归方法一直向上寻找父节点,直到找到自己集合的根节点为止
(3)合并操作:
让其中一方的根节点更改指向为另一方的根节点
eg:x,y作为各自集合的根节点,我们可以让x的父节点变为y,反之亦可
(4)优化:
最差情况下,整个并查集会变成链式,这时候我们find的递归深度会很深,如果多次查询时间复杂度会很高
所以我们利用记忆化方法,在进行过一次find之后,将所有经过的节点的并查集存储都改为根节点
3.2普通并查集
例题:
3.3扩展域并查集
当元素之间存在不止一种关系的时候,就需要使用扩展域并查集
**比如:**人们之间可以存在朋友关系,也可以存在敌人关系,如果并查集的集合只有一种关系就不合适了。此时我们需要有两类集合
**核心实现:**通过认为划分区域来达到区分集合类型的目的
比如一共有n个人,将1-n划分为朋友域,n+1~n+n为敌人域
例题:
3.4带权并查集
在并查集的基础上给每个节点多添加了一个权值,这个权值可以表示当前节点和父节点的关系,比如距离/关系(特定数字表示特定关系)
**核心:**在进行并查集操作的同时要对权值数组也做合适操作
4.字符串哈希
字符串哈希就是将一个字符串用整数表示
**核心思想:**通过ASCII码值以及哈希运算将字符串中的字符与数字转换为哈希值,从而用哈希值来标识这个字符串,不过为了避免出现大量哈希冲突,我们的进制p设为131或者13331
**计算哈希值的方式:**使用使用和进制计算一样的方法,逐层进行计算(最多从p^0~p^n)
例题:
5.字典树
字典树是一种用于快速存储和查询字符串的多叉树结构,核心是利用字符串的公共前缀将字符串以树形结构存储下来
应用场景:
1.查询某个单词是否出现过,出现次数是多少
2.查询有多少个单词是以某个字符串为前缀
3.查询所有以某个前缀开头的单词
模板题: