本文最后更新于:3 天前
应用场景
主要用来解决子数组问题,比如让你寻找符合某个条件的最长/最短子数组
框架模板
基于这个框架,遇到子串/子数组相关的题目,你只需要回答以下三个问题:
1、什么时候应该移动 right 扩大窗口?窗口加入字符时,应该更新哪些数据?
2、什么时候窗口应该暂停扩大,开始移动 left 缩小窗口?从窗口移出字符时,应该更新哪些数据?
3、什么时候应该更新结果?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| void slidingWindow(String s) { Object window = ... int left = 0, right = 0; while (right < s.length()) { char c = s[right]; window.add(c) right++; ...
printf("window: [%d, %d)\n", left, right);
while (left < right && window needs shrink) { char d = s[left]; window.remove(d) left++; ... } } }
|
算法步骤
- 初始化化目标和窗口容器
- 初始化满足目标计数器
- 初始化结果返回值(指针和偏移量(长度))
- 初始化左右窗口双指针
- 循环右动右指针直至边界
- 入值扩大窗口
- 更新窗口内的相关数据
- 循环判断是否满足收缩条件
- 更新结果返回值
- 取值缩小窗口
- 更新窗口内的相关数据
- 返回结果