当前位置: 首页 > article >正文

滑动窗口最大/小值(单调队列)

给定一个大小为 n≤1e6的数组。

有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。

你只能在窗口中看到 k 个数字。

每次滑动窗口向右移动一个位置。

以下是一个例子:

该数组为 [1 3 -1 -3 5 3 6 7],k 为 3 3。

窗口位置最小值最大值
[1 3 -1] -3 5 3 6 7-13
1 [3 -1 -3] 5 3 6 7-33
1 3 [-1 -3 5] 3 6 7-35
1 3 -1 [-3 5 3] 6 7-35
1 3 -1 -3 [5 3 6] 736
1 3 -1 -3 5 [3 6 7]37

你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。

输入格式

输入包含两行。

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

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

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

输出格式

输出包含两个。

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

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

输入样例:

8 3
1 3 -1 -3 5 3 6 7

输出样例:

-1 -3 -3 -3 3 3
3 3 5 5 6 7

题解

#include<iostream>

using namespace std;

const int N = 1e6 + 10;

int a[N], q[N], hh, tt;//q[N]用于存放元素下标

void init(){
    hh = 0, tt = -1;
}

int main(){
    int n, k;
    
    init();
    cin >> n >> k;
    for(int i = 0; i < n; i++){
        scanf("%d", &a[i]);
        if(i - k + 1 > q[hh])hh++;//如果当前最值已不在滑动窗口内,队首右移
        while(hh <= tt && a[i] <= a[q[tt]])tt--;//将逆序元素弹出
        q[++tt] = i;
        if(i + 1 >= k)cout << a[q[hh]] << " ";
    }
    cout << endl;
    init();//重置
    for(int i = 0; i < n; i++){//同理
        if(i - k + 1 > q[hh])hh++;
        while(hh <= tt && a[i] >= a[q[tt]])tt--;
        q[++tt] = i;
        if(i + 1 >= k)cout << a[q[hh]] << " "; 
    }
    cout << endl;
    
    return 0;
}


http://www.kler.cn/a/15395.html

相关文章:

  • 第6章详细设计 -6.7 PCB工程需求表单
  • 使用nossl模式连接MySQL数据库详解
  • 脑机接口、嵌入式 AI 、工业级 MR、空间视频和下一代 XR 浏览器丨RTE2024 空间计算和新硬件专场回顾
  • 深度学习transformer
  • 1 设计模式原则之开闭原则
  • 十:详解HTTP的请求行
  • 标准ACL配置
  • 代码随想录Day64(一刷完结)
  • linux0.12
  • Java BIO(Blocking IO:同步并阻塞式IO)
  • idea使用 ( 五 ) idea常用快捷键
  • 知识图谱实战应用6-基于知识推理进行知识补全的功能
  • 「 Redis 」RDB和AOF持久化全面解析
  • 使用Sybase sp_recompile重新编译存储过程和触发器
  • 如何使用osquery在Windows上实时监控文件?
  • Java新提案,最终还是靠近C#了
  • 高度可定制可用于商用目的全流程供应链系统(全部源码)
  • Python 二进制 八进制 十进制 十六进制之间的转换
  • JSP数据库连接池的研究与实现(源代码+论文)
  • 嵌入式安卓开发:使用Camera2获取相机
  • 网络安全真的没法入行吗?
  • RedHat8配置本地YUM源
  • 知识图谱实战应用7-最完整的常用Cypher查询语句与实际应用
  • Unlimited “使用GPT-4 ”!它来了!
  • html学习(布局方式(layout)、浮动(float)、定位(position)、弹性盒(flex))
  • C++设计模式11:享元模式