声明
本文资料参考acwing算法基础课
地址:https://www.acwing.com
概述
- 解决问题:求一个滑动窗口中满足某条件的值
- 使用一个数组a存储原数组,一个数组q存储窗口队列中有用的下标
- 保证:窗口中新进入一个元素就可以排除掉没有用的元素
- 保证:队列中下标的范围在窗口内
模板记忆
这个模板分为三个部分:
- 保窗口:移动队头,保证窗口大小
- 删元素:移动队尾删除被新元素筛掉的元素
- 插元素:插入新元素
模板代码
int a[N], q[N]; // a是原数组,q是队列(存储下标)
int l = 0, r = 0; // 初始化队列
// 最小值窗口
for (int i = 0; i < n; i ++ )
{
if (l < r && q[l] <= i - k) l ++ ; // 窗口移动时,保证队列的下标都在窗口中
while (l < r && a[q[r - 1]] >= a[i]) r -- ; // 新元素的到来删掉一些没用的元素
q[r ++ ] = i; // 插入新元素
if (i >= k - 1) cout << a[q[l]] << ' '; // 输出所查
}
cout << endl;