一、常用方法
1、双指针
2、滑动窗口
- 涉及求最大/最小子数组或子串时,用一个循环代替两个for循环
- 右指针表示窗口的终止位置
思路
- i, j指针分别代表窗口的初始位置和终止位置,区间表示为[i,j]
- 加入j指针指向的数组元素到窗口中——寻找可行解
- 窗口扩大到满足条件(限制+最大/最小),移动i指针缩小窗口,直到刚好不满足限制——寻找最优解
- 如求最小覆盖子串,只要窗口内包含了子串相应的字母种类和个数,就满足了条件,需要缩小窗口;而求最大长度,尽可能扩大窗口,直到不满足限制
- 因此,求最小值时,结果应在缩小窗口时更新;求最大值时,结果应在扩大窗口时更新
3、模拟
- 螺旋矩阵
二、常用算法
二分法——有序数组找目标值或边界
- 循环不变量原则:保持每次循环时区间以及左右边界定义不变