学习心得
一、单调栈
-
应用范围:
求序列中每一个 数 离它最近的左/右边的比它小/大的数。 -
基本思想:
类似双指针
若存在 ax >= ay 且 x<y, 则ax被删除。
最终序列变为严格单调。
-
解题思路:
先想暴力做法,再找规律优化
二、单调队列
-
应用范围:
求长度为 n 的滑动窗口 中的最 小/大 值。
优化多重背包 -
基本思想:
与单调栈类似
通过删除点使得序列变为严格单调。 -
优点:
时间复杂度从暴力解法的O(n2)降为O(1)
数组模拟栈队列比STL更快一些,可防止卡常数
三、KMP
- 应用范围:
字符串匹配问题。 - 关键点:
求next数组:next[i] = j
即
P[1, j] = P[i-j+1, i]
- 基本思想:
以 j 为终点的后缀与前缀相等。 - 注意:
下标从1开始
next[N] 可能会报错,改为 ne[N] 即可。 - 时间复杂度:O(m)
1.6小结
- 《算法基础课》
- AcWing 6题(826-830, 154)