AcWing 154. 滑动窗口 单调队列
地址 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. 滑动窗口 单调队列的更多相关文章
- Acwing 154 滑动窗口(单调队列)经典模板
给定一个大小为n≤106n≤106的数组. 有一个大小为k的滑动窗口,它从数组的最左边移动到最右边. 您只能在窗口中看到k个数字. 每次滑动窗口向右移动一个位置. 以下是一个例子: 该数组为[1 3 ...
- AcWing 154. 滑动窗口
https://www.acwing.com/problem/content/156/ #include <iostream> using namespace std; ; int a[N ...
- luoguP1886 滑动窗口 [单调队列]
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- [POJ2823]Sliding Window 滑动窗口(单调队列)
题意 刚学单调队列的时候做过 现在重新做一次 一个很经典的题目 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗 ...
- POJ 2823 滑动窗口 单调队列
https://vjudge.net/problem/POJ-2823 中文:https://loj.ac/problem/10175 题目 给一个长度为 $N$ 的数组,一个长为 $K$ 的滑动窗体 ...
- [洛谷P1886]滑动窗口 (单调队列)(线段树)
---恢复内容开始--- 这是很好的一道题 题目描述: 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口. 现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的 ...
- [Luogu P1886]滑动窗口--单调队列入门
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- AcWing 154. 滑动窗口(模板)
(https://www.acwing.com/problem/content/156/) 给定一个大小为n≤106n≤106的数组. 有一个大小为k的滑动窗口,它从数组的最左边移动到最右边. 您只能 ...
- 洛谷 P1886 滑动窗口(单调队列)
题目链接 https://www.luogu.org/problemnew/show/P1886 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始 ...
随机推荐
- DataGridView右键菜单自定义显示及隐藏列
WinForm程序中表单的列可自定义显示及隐藏,是一种常见的功能,对于用户体验来说是非常好的.笔者经过一段时间的摸索,终于实现了自己想要的功能及效果,现记录一下过程: 1.新建一个自定义控件,命名为: ...
- pillow模块Image.crop()函数切割图片方法,参数说明
使用Image.crop()方法对图片进行切割. 参数: Image.crop(left, up, right, below) left:与左边界的距离 up:与上边界的距离 right:还是与左边界 ...
- 一文解读RESTful (转)
01 前言 回归正题,看过很多RESTful相关的文章总结,参齐不齐,结合工作中的使用,非常有必要归纳一下关于RESTful架构方式了,RESTful只是一种架构方式的约束,给出一种约定的标准,完全严 ...
- IDEA编译报错Error:java: Compilation failed: internal java compiler error
根据报错可以知道是编译某个模块报错, 接下来就是检查这个模块的编译版本 解决办法很简单:File-->Setting...-->Build,Execution,Deployment--&g ...
- 生产环境Shell脚本Ping监控主机是否存活(多种方法)
在网上针对shell脚本ping监控主机是否存活的文档很多,但大多都是ping一次就决定了状态,误报率会很高,为了精确判断,ping三次不通再发告警,只要一次ping通则正常.于是,今天中午抽出点时间 ...
- 《Web Development with Go》JWT认证满意版
这个比昨晚的要满意, 认证放到中间件那里了. Mux使用的是gorilla, 中间件使用的是negroni, 启动是用的negroni.classic方法. package main import ( ...
- centos7 链路聚合+KVM桥接连网
一.两个物理网卡做链路聚合(em3,em4) 1)创建team类型的网卡,连接别名为team0,使用的模式为activebackup-主备/loadbalance-负载均衡nmcli con add ...
- PHP—— 商品物流实时查询接口 (快递100API对接)
PHP后台 与前端 对接商品物流信息的接口 运用的 快递100的API接口 public function getExpress() { $user_id = input('post.user_ ...
- C#基础知识1-深入理解值类型和引用类型
C#值类型和引用类型这个概念在刚学习的时候应该就知道了.但是我们并没有深入的去理解它.越是基础知识其实才是最有用的.对代码的优化,代码质量的提升都有帮助.通过整理本文章,对很多知识也起到了巩固的作用吧 ...
- C#中获取指定路径下指定后缀名的所有文件的路径的list
场景 指定一个路径和后缀名,查找这个路径下所有以此后缀名结尾的文件. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取 ...