http://poj.org/problem?id=2823

这就要用到单调递减或单调递增队列来实现,它的头元素一直是队列中的最小值或最大值。我们可以从队列的末尾插入一个元素,可以从队列的两端删除元素。

插入元素:

对于单调递减队列:队头放最大值,为了保持队列的递减性,我们在插入元素v的时候,要将队尾元素与v比较,如果队尾<v,则删除队尾元素,然后继续将新的队尾元素与v比较,直到队尾元素>v,这时才将v插入队尾。

删除队首元素:

队尾元素的删除刚刚已经说了,那么队首的元素什么时候删除呢?当队首元素的索引或下标小于i-k+1的时候,说明队首元素已经没用了,因为他已经不在窗里了,所以当队首元素索引或下标<i-k+1时,将队首元素删除。

#include<iostream>
#include<cstdio>
#include<deque>
using namespace std;
const int maxn=1e6+6;
struct node
{int val,id;
};
int minn[maxn],maxx[maxn],a[maxn];
int main()
{int n,k,i;node now;deque<node>qmin;deque<node>qmax;scanf("%d%d",&n,&k);scanf("%d",&now.val);now.id=1;a[1]=now.val;minn[1]=now.val;qmin.push_back(now);for(i=2;i<=n;i++){scanf("%d",&a[i]);now.val=a[i];now.id=i;while(!qmin.empty()&&qmin.back().val>a[i])qmin.pop_back();qmin.push_back(now);if(!qmin.empty()&&qmin.front().id<i-k+1)qmin.pop_front();minn[i]=qmin.front().val;}maxx[1]=a[1];now.val=a[1];now.id=1;qmax.push_back(now);for(i=2;i<=n;i++){now.val=a[i];now.id=i;while(!qmax.empty()&&qmax.back().val<a[i])qmax.pop_back();qmax.push_back(now);if(!qmax.empty()&&qmax.front().id<i-k+1)qmax.pop_front();maxx[i]=qmax.front().val;}for(i=k;i<n;i++)printf("%d ",minn[i]);printf("%d\n",minn[n]);for(i=k;i<n;i++)printf("%d ",maxx[i]);printf("%d\n",maxx[n]);
}

Sliding Window 单调队列解决--经典滑动窗口问题--求窗口的最大值最小值相关推荐

  1. POJ2823 Sliding Window 单调队列

    题目大意 给出一段序列,一个长度一定的窗口从左到右滑动.求窗口滑动到每个位置时窗口内数字的最大值.最小值各是多少.n<=1e6. 总体思路 遇到这种对一个沿着一个方向滑动的区间求最值问题,可以运 ...

  2. POJ 2823 Sliding Window (单调队列)

    单调队列 加了读入挂比不加更慢.... 而且这份代码要交c++ 有大神G++跑了700ms..... orzorzorz #include<iostream> #include<cs ...

  3. 算法学习 (门徒计划)4-1 单调队列及经典问题及经典例题 学习笔记

    算法学习 (门徒计划)4-1 单调队列及经典问题及经典例题 学习笔记 前言 单调队列 场景举例(RMQ) 应用-维护区间最值的方式 数据结构-自行设计单调队列 代码实现(java) 例题分析(略) 总 ...

  4. POJ 2823-Sliding Window单调队列解题报告

    链接:http://poj.org/problem?id=2823 利用单调队列的出队入队,维护区间的最值,保证队列单调递增或单调递减,要维护单调递增队列,当一个数字插入的时候,从队尾往前找到第一个比 ...

  5. 迷宫2 ——单调队列解决bfs问题

    链接:https://ac.nowcoder.com/acm/problem/15196 来源:牛客网 题目描述 这是一个关于二维格子状迷宫的题目.迷宫的大小为N*M,左上角格子座标为(1,1).右上 ...

  6. Acwing算法基础课学习笔记(四)--数据结构之单链表双链表模拟栈模拟队列单调栈单调队列KMP

    单链表 算法题中最常考的单链表就是邻接表(用来存储图和数),比如最短路问题,最小生成树问题,最大流问题.双链表用于优化某些问题. 利用数组来表达单链表:存储值和指针的两个数组利用下标进行关联. 需要注 ...

  7. 滑动窗口--单调队列

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

  8. 【Leetcode单调队列】- 洛谷P1714切蛋糕

    单调队列 解决该类问题的重点维护一个队列,从队首到队尾是递减的,队首是最大的.队尾是最小的. 队尾接受值,队首排出值. Java实现用双端队列,前面接收值,后面排出来值. 这类题目往往是跟滑动窗口一起 ...

  9. 算法学习12: 单调队列和单调栈

    算法学习12: 单调队列和单调栈 单调队列 单调队列解决的问题: 窗口内最大/最小值的更新结构 单调队列的结构和操作 单调队列的应用 题目一: 生成窗口最大值数组[leetcode 239](http ...

最新文章

  1. 理性解读中国科技实力:不震惊式吹捧,也不全盘抹杀
  2. Process monitor词汇汉化
  3. Java学习之注解Annotation实现原理
  4. php程序员面试题(持续补充,偏中级面试题)
  5. Android框架式编程之BufferKnife
  6. 数据的存储特殊矩阵压缩存储【数据结构F】
  7. JBPM4.4总结-嵌入自己的用户体系(集成自定义用户表)
  8. 足不出户逛里约 神马搜索推出奥运会蓝光页面
  9. SHEditor v0.3 SkinSharp皮肤设计工具
  10. vs2015使用教程
  11. 多个excel如何合并
  12. db9针232接口波特率标准_RS232串口通信:接口定义、标准接法详细说明,一看就懂了...
  13. android中桌面倒计时,android 倒计时显示
  14. 谷歌统计Google Analytics使用入门
  15. 计算机音乐谱一壶老酒,一壶老酒简谱(歌词)-陆树铭演唱-沈公宝曲谱
  16. mp3音频转换,合并方法?-QVE音频剪辑
  17. Python|阶梯电价问题
  18. Arduino RGB颜色渐变代码(附上C语言版本)
  19. 明光市机器人_明光市安保巡逻机器人在线咨询
  20. 地标海之珠夜色素材高清图片

热门文章

  1. js原型和原型链_初识JS原型/原型链/原型继承
  2. python3.7安装步骤-Python 3.7.0安装教程(附安装包) | 我爱分享网
  3. 如何自学python知乎-马哥教育官网-专业Linux培训班,Python培训机构
  4. python用什么来写模块-用Python编写模块有何技巧?
  5. 零基础学python-Python入门教程完整版(懂中文就能学会)
  6. python网课哪个好-python网课学习笔记--4
  7. python入门指南by-Python 入门指南
  8. python基础教程廖雪峰云-Python 基础教程
  9. 学术|浅谈语音识别、匹配算法和模型
  10. php修改mysql排序_php – 自定义MySQL排序