0
点赞
收藏
分享

微信扫一扫

【算法基础课模板笔记+注释】 数据结构07 --- 单调队列(滑动窗口)

老罗话编程 2022-02-19 阅读 56

声明

本文资料参考acwing算法基础课
地址:https://www.acwing.com

概述

  1. 解决问题:求一个滑动窗口中满足某条件的值
  2. 使用一个数组a存储原数组,一个数组q存储窗口队列中有用的下标
  3. 保证:窗口中新进入一个元素就可以排除掉没有用的元素
  4. 保证:队列中下标的范围在窗口内

模板记忆

这个模板分为三个部分:

  1. 保窗口:移动队头,保证窗口大小
  2. 删元素:移动队尾删除被新元素筛掉的元素
  3. 插元素:插入新元素

模板代码

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;
举报

相关推荐

0 条评论