https://www.acwing.com/problem/content/156/

#include <iostream>
using namespace std;
const int N = ;
int a[N], q[N];//a是原来的值,q是队列 存的是下标
int main() {
int n, k;
scanf("%d%d", &n, &k);
for (int i = ; i < n; i ++ ) scanf("%d", &a[i]);
int hh = , tt = -; //定义队头和队尾,开始是空的
for (int i = ; i < n; i ++ ) { //i是右端点
//因为每次最多只有一个数字不在窗口内,所以只需要移动一个,也就是用if
//判断队头是否已经滑出了窗口,先判断是不是空的
if (hh <= tt && i - k + > q[hh]) //终点是i,起点是i-k+1 ,如果起点大于q【hh】,说明已经滑出窗口
hh ++ ;//队头加一 ,加以之后,之前的数字就不会再被用到
while (hh <= tt && a[q[tt]] >= a[i])
tt -- ; //如果准备插入的数字比队尾的小,那么队尾的就没有用了,那么就把队尾的删掉,会一直删除,直到,不满足hh <= tt,队列变为空
//虽然会删除,但不会改变滑动窗口的长度,因为滑动窗口是根据下标来移动的
//如果准备插入的数字比队尾的大,就不用删除,直接插进去 ,最终会单调递增
q[ ++ tt] = i;//再把当前的数字插进去,放到队尾,如果之前的删除使队列变为空,因为+1,所以会多一个
if (i >= k - ) printf("%d ", a[q[hh]]);//因为队头一定会是最小的,所以,输出队头
}
puts("");
hh = , tt = -;
for (int i = ; i < n; i ++ ) {
if (hh <= tt && i - k + > q[hh]) hh ++ ;
while (hh <= tt && a[q[tt]] <= a[i]) tt -- ;
q[ ++ tt] = i;
if (i >= k - ) printf("%d ", a[q[hh]]);
}
puts("");
return ;
}

最新文章

  1. input range样式更改,模拟滑块
  2. c# UrlEncode,UrlDecode
  3. DELPHI类声明方式简介
  4. ssh scp 复制文件和文件夹
  5. CSS-Transform-transition-Animation
  6. HTML5的fieldset标签
  7. myisam 与innodb的区别
  8. ModSecurity for Nginx
  9. 【Android基础】listview控件的使用(4)-----自定义布局的listview的使用
  10. c# 关于10进制和16进制转换以及显示
  11. Url以.(点)结尾,在使用httpwebrequest读取的时候,微软会有一个bug……
  12. leetcode83,删除有序链表中的重复元素
  13. 负载均衡之nginx
  14. NOIP2011题解
  15. 如何书写一篇能看懂的html和CSS代码
  16. axios+Vue上传文件显示进度
  17. 面向对象+jquery实现拖拽功能
  18. 第19月第2天 cellForItemAtIndexPath 返回空
  19. DVWA--XSS解题过程
  20. 2015 -&amp;gt; 2016

热门文章

  1. SGDClassifier梯度下降分类方法
  2. idea 代码没有被svn控制
  3. PAT (Basic Level) Practice (中文)1037 在霍格沃茨找零钱 (20 分)
  4. spark.streaming.kafka.maxRatePerPartition的理解
  5. laravel打印查询sql
  6. 翻转引起 cocos studio 引擎与cocos2d 代码相同坐标显示不同
  7. 曼孚科技:数据标注,AI背后的百亿市场
  8. Phalanx HDU - 2859 dp
  9. LaTeX技巧007:每一章开始的header引用名言应该怎么做?
  10. 51Nod 1344 走格子 (贪心)