今天所学的主要是三个个大知识点🙃;
首先是单调队列和单调栈:
Eg:
这道题就是一道典型的单调栈
这道题就是一道典型的单调队列
先解说一下这两个名词“单调栈” “单调队列”的区别:
很显然,区别就是一个是栈,一个是队列 (🐷:废话)
好吧,“单调”可以说明二者都具有单调性,单调增or单调减(自己维护);“栈”具有先进后出的性质,而“队列”具有先进先出的性质。
接下来就是怎样维护单调性:
- 要考虑单调性:一般来讲,求MAX是单调减;求MIN是单调增。
- 维护单调性:建一个栈or队列,进一个比较一个,符合单调性的就进去不符合的就出去再进去。
- 找最值;
那么这两道题就可以很好的解出来了。
其次则是HASH(字符串HASH):
Eg of HASH:
Eg of 字符串 HASH:
这两道题就是HASH和字符串HASH的典型。((。・∀・)ノ)
HASH:HASH就是一个像函数一样的东西,你放进去一个值,它给你输出来一个值。输出的值就是HASH值。一般HASH值会比原来的值更好储存(更小)或比较。😑
字符串HASH:把字符串转换成一个整数的函数。而且要尽量做到使字符串对应唯一的Hash值。
值得注意的是:
HASH的P取的是最接近N的素数,字符串HASH中的P一般取131or13331,
这样就可能尽可能减少冲突。
当然,如果题目非得让你冲突,你取啥也没用(ㄟ( ▔, ▔ )ㄏ),因此就得推荐几款消除冲突的APP: - 拉链法:每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向
链表连接起来
2.再HASH法:就是多次HASH,取不同的P,直到没有冲突
3.(课外)建立公共溢出区:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表
最后则是KMP算法:
Eg of KMP
Eg of 引申
首先,要知道KMP是干什么的:KMP全称为字符串查找算法,是在一个文本串S内找一个模式串P出现的位置。
其次,则是KMP中一些必备的东西(😵): - NEXT数组:代表当前字符之前的字符串中,有多大长度的相同前缀后缀。(有些预处理的意思)
(这里的p就是NEXT)
2.KMP常规操作:
注意:NEXT数组和常规操作需要根据题目来进行改变,不能学死。(👍)
Eg:
这道题就需要在操作上改变一下。
🐷:所学所获到这里就结束了(😱😱😱);
{
T
Q
L
}