地址 https://www.acwing.com/problem/content/description/156/

输入格式

输入包含两行。

第一行包含两个整数n和k,分别代表数组长度和滑动窗口的长度。

第二行有n个整数,代表数组的具体数值。

同行数据之间用空格隔开。

输出格式

输出包含两个。

第一行输出,从左至右,每个位置滑动窗口中的最小值。

第二行输出,从左至右,每个位置滑动窗口中的最大值。

输入样例:

  - -
输出样例:
- - - -

算法1
单调队列
求最大值和最小值的过程其实是一样的 就是求极值的过程
以求最小值为例
我们使用一个队列来进行记录 处于滑动窗口的m个数字
以插入的数据的角度来看
如果插入的数据比之前的m-1个数字都小 那么它就将清空之前的m-1个数字成为队首
如果插入的数据比之前m-1个数字中的某一个数字较大 那么它在该数字退出队列后 还是有可能成为最小数值的,也需要保留该插入数字,只不过插入的数字不是队首(以后有可能成为队首)

这个队里有三个性质
1 队首是最小数(以求最小值为例)
2 队列中队首和队尾数字的索引差值最大为m,也就是控制数值在滑动窗口范围内
3 队列中前部的数字如果比后面的数字大,那么在m个的滑动窗口中,它是不可能成为最小值(队首)的,需要排除出队列

这样就保证了队列的单调性
该队列记录的是数字的索引 方便控制当前记录的数值范围 而不是数字的值 这个需要注意

时间复杂度
参考文献

代码

 #include <iostream>
#include <deque>
#include <vector> using namespace std; /*
输入样例:
8 3
1 3 -1 -3 5 3 6 7
输出样例:
-1 -3 -3 -3 3 3
3 3 5 5 6 7
*/ int n, m; int arr[];
deque<int> min_val, max_val;
vector<int> s_min, s_max; int main()
{
cin >> n >> m; for (int i = ; i < n; i++) {
cin >> arr[i];
} for (int i = ; i < n; i++) {
//
while (!min_val.empty() && ( i - min_val.front()) >= m)
min_val.pop_front();
while (!max_val.empty() && (i - max_val.front()) >= m)
max_val.pop_front(); while (!min_val.empty() && arr[min_val.back()] >= arr[i])
min_val.pop_back(); while (!max_val.empty() && arr[max_val.back()] <= arr[i])
max_val.pop_back(); min_val.push_back(i);
max_val.push_back(i); s_min.push_back(min_val.front());
s_max.push_back(max_val.front());
} for (int i = m - ; i < n; i++)
cout << arr[s_min[i]] << " ";
cout << endl;
for (int i = m - ; i < n; i++)
cout << arr[s_max[i]] << " "; return ;
}

AcWing 154. 滑动窗口 单调队列的更多相关文章

  1. Acwing 154 滑动窗口(单调队列)经典模板

    给定一个大小为n≤106n≤106的数组. 有一个大小为k的滑动窗口,它从数组的最左边移动到最右边. 您只能在窗口中看到k个数字. 每次滑动窗口向右移动一个位置. 以下是一个例子: 该数组为[1 3 ...

  2. AcWing 154. 滑动窗口

    https://www.acwing.com/problem/content/156/ #include <iostream> using namespace std; ; int a[N ...

  3. luoguP1886 滑动窗口 [单调队列]

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  4. [POJ2823]Sliding Window 滑动窗口(单调队列)

    题意 刚学单调队列的时候做过 现在重新做一次 一个很经典的题目 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗 ...

  5. POJ 2823 滑动窗口 单调队列

    https://vjudge.net/problem/POJ-2823 中文:https://loj.ac/problem/10175 题目 给一个长度为 $N$ 的数组,一个长为 $K$ 的滑动窗体 ...

  6. [洛谷P1886]滑动窗口 (单调队列)(线段树)

    ---恢复内容开始--- 这是很好的一道题 题目描述: 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口. 现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的 ...

  7. [Luogu P1886]滑动窗口--单调队列入门

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  8. AcWing 154. 滑动窗口(模板)

    (https://www.acwing.com/problem/content/156/) 给定一个大小为n≤106n≤106的数组. 有一个大小为k的滑动窗口,它从数组的最左边移动到最右边. 您只能 ...

  9. 洛谷 P1886 滑动窗口(单调队列)

    题目链接 https://www.luogu.org/problemnew/show/P1886 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始 ...

随机推荐

  1. Docker Compose 基本使用

    Dockercompose v3官网文档:  https://docs.docker.com/compose/compose-file/   Dockercompose中文: http://www.d ...

  2. JavaScript for 、for...of 、for...in 等 iteration 效率测试

    由于不同浏览器,不同版本性能不一,且控制台本质是是套用了一大堆eval,沙盒化程度高,所以需使用node环境测试来提高准确性 // 准备待测数组 const NUM = 1e7; let arr = ...

  3. ReactCocoa 关键字

    ReactCocoa关键字 RACSiganl RACSubject和RACReplaySubject RACTuple元组 RACSequence RAC中的集合类,用于代替NSArray,NSDi ...

  4. Vue-Cli 3.0 中配置高德地图

    vue 中使用高德地图有两种方式 一.vue-amap 组件 官网: https://elemefe.github.io/vue-amap/#/ 开始的时候是打算用这个组件做地图功能的,但是尝试之后存 ...

  5. SQL保留2位小数

    truncate(num, 位数); );

  6. 【2期】JVM必知必会

    JVM之内存结构图文详解 Java8 JVM内存结构变了,永久代到元空间 Java GC垃圾回收机制 不要再问我“Java 垃圾收集器”了 Java虚拟机类加载机制 Java虚拟机类加载器及双亲委派机 ...

  7. [洛谷P1144][题解]最短路计数

    这道题可以用各种算法踩掉,我选择的是SPFA. 因为题目要求计数,所以我们开一个ans数组表示数量. 分两种情况讨论: 一:dis_v>dis_u+1 最短路被更新了,可以直接ans_v=ans ...

  8. 各种数和各种反演(所谓FFT的前置知识?)

    每次问NC做多项式的题需要什么知识点. 各种数. 各种反演. 多项式全家桶. 然后我就一个一个地学知识点.然而还差好多,学到后面的前面的已经忘了(可能是我太菜吧不是谁都是NC啊) 然后发现每个知识点基 ...

  9. 线段树模板加模板题POJ3468

    POJ - 3468 整理了个新的线段树的模板,暑期集训的时候学长给的模板,每个节点单单存了自己所要维护的内容,还是少了点.导致在写pushdown的时候,len我会有点难写.所以就整理个新的模板. ...

  10. 在CV尤其是CNN领域的一些想法

    现在的CNN还差很多,未来满是变数. 你看,现在的应用领域也无非merely就这么几类----分类识别,目标检测(定位+识别),对象分割......,但是人的视觉可不仅仅这么几个功能啊!是吧. 先说说 ...