单调队列

acwing 154滑动窗口,单调队列q 存的是下标,真正的值需要再套一个a数组

复制代码
 1 #include<iostream>
 2 using namespace std;
 3 
 4 const int N = 1e6 + 10;
 5 
 6 int n,k;
 7 int a[N],q[N]; //q代表单调队列
 8 
 9 int main()
10 {
11     scanf("%d%d", &n,&k);
12     for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
13     
14     int hh = 0,tt = -1;
15     for (int i = 0; i < n; i ++ )
16     {
17         //判断队头是否已经弹出队列
18         if(hh <= tt && i - k + 1 > q[hh]) hh ++; //头出窗口 hh向前移动一格;
19         while(hh <= tt && a[q[tt]] >= a[i]) tt --; // 若不满足单调性,那么将队尾元素删除;
20         q[ ++tt] = i; //将元素添加到队尾
21         if(i >= k - 1) printf("%d ",a[q[hh]]);
22     }
23     puts(" ");
24     
25     hh = 0,tt = -1;
26     for (int i = 0; i < n; i ++ )
27     {
28         if(hh <= tt && i - k + 1 > q[hh]) hh ++;
29         while(hh <= tt && a[q[tt]] <= a[i]) tt --;
30         q[ ++tt] = i;
31         if(i >= k - 1) printf("%d ",a[q[hh]]);
32     }
33     puts(" ");
34     
35     return 0;
36 }
View Code
复制代码

 

posted @   rw156  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示