首页 > 编程语言 >算法板子:滑动窗口——应用单调队列,找到窗口中的最小值与最大值

算法板子:滑动窗口——应用单调队列,找到窗口中的最小值与最大值

时间:2024-07-27 20:25:03浏览次数:18  
标签:窗口 int 最大值 队头 hh 队列 最小值

#include <iostream>
using namespace std;

const int N = 1e6 + 10;
int a[N];
// q数组模拟单调队列; q数组存储原数组元素的下标; 
// 递增单调队列的队头始终维护窗口中的最小值; 队头存的是窗口中最小值的下标
// 递减单调队列的队头始终维护窗口中的最大值; 队头存的是窗口中最大值的下标
int q[N], hh, tt = -1;

int main()
{
    int n, k;
    cin >> n >> k;
    for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
    
    
    // 找窗口中最小值
    for (int i = 0; i < n; i ++ )
    {
        // 队头始终维护当前窗口最小值,如果队头已经不在窗口中,将队头移出队列
        if (hh <= tt && q[hh] < i - k + 1) hh ++ ;
        // 队列必须是单调递增的,新加入队列的元素的值得比队尾的值大
        while (hh <= tt && a[i] <= a[q[tt]]) tt -- ;
        // 窗口中每加入一个新元素,队列需要加入该元素的下标
        q[ ++ tt] = i;
        
        // 当窗口长度满足题目条件时,输出每个窗口的最小值,由队头维护
        if (i >= k - 1) printf("%d ", a[q[hh]]);
    }
    printf("\n");
    
    // 清空队列,重新维护一个递减单调队列
    hh = 0, tt = - 1;
    // 找窗口中的最大值
    for (int i = 0; i < n; i ++ )
    {
        // 队头始终维护当前窗口最大值,如果队头已经不在窗口中,将队头移出队列
        if (hh <= tt && q[hh] < i - k + 1) hh ++ ;
        // 队列必须单调递减,新加入队列的元素的值需要比队尾元素的值小
        while (hh <= tt && a[i] >= a[q[tt]]) tt -- ;
        // 向队列中加入新元素的下标
        q[ ++ tt] = i;
        
        // 当窗口长度满足题目条件时,输出每个窗口的最大值,由队头维护
        if (i >= k - 1) printf("%d ", a[q[hh]]);
    }
    
    return 0;
}

标签:窗口,int,最大值,队头,hh,队列,最小值
From: https://blog.csdn.net/m0_67839004/article/details/140738408

相关文章

  • Python 与 Visual Studio Professional 2022(64 位)- 预览版本 5.0 交互窗口挂起
    我正在MicrosoftVisualStudioProfessional2022(64位)-预览版17.11.0预览版5.0上运行Python开发工作负载。我正在关注VisualStudio中的Python教程https://learn.microsoft.com/en-us/visualstudio/python/tutorial-working-with-python-in-visual-studio-st......
  • 代码随想录day11 || 150 逆表达式求值 239 滑动窗口最大值 347 前k最高频元素
    150逆波兰表达式计算funcevalRPN(tokens[]string)int{ //自己想是真的想不出来,看了视频之后有了思路 //本质上逻辑就是遇到数字入栈,遇到运算符号出栈两个元素然后计算再入栈,最终就是计算结果 stack:=Constructor() for_,val:=rangetokens{ //如果数字入......
  • Windows窗口函数常规
    1、wWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPWSTRlpCmdLine,intnCmdShow)宽字符版本主函数hInstance(HINSTANCE):这是一个句柄,指向当前应用程序的实例。当程序启动时,系统会为该应用程序创建一个实例,并且这个句柄会被用来标识它。此句柄可以......
  • FlinkSQL窗口函数TUMBLE、SESSION 和 HOP的区别
    目录TUMBLE滚动窗口(TumblingWindow)SESSION会话窗口(SessionWindow)HOP滑动窗口(HoppingWindow)小结HOP窗口为什么不需要rowtime(事件时间) PROCTIME()vsrow_time 为什么HOP窗口常用PROCTIME()?总结TUMBLE、SESSION可以使用处理时间嘛TUMBLE窗口(滚动窗口)SESS......
  • Numpythonic 方式从所需的时间步长和窗口大小构造窗口向量
    给定参数timestep=2window_size=3我已经展平了大小为9的时间序列向量。内容是:arr=np.array([1,2,3,4,5,6,7,8,9])如何使用这些参数重塑/构造窗口时间序列?我希望输出具有形状unknown,window_size)所以,它的输出将是这样的矩阵:windowed_arr=np......
  • 当 python 窗口的一部分不在屏幕上时,如何让它自己被记录?
    在Windows10中,大多数应用程序窗口都可以使用OBS等程序进行记录。当窗口被拖动以致其部分内容在显示屏上不可见时,通常OBS仍会接收窗口的内容,即使它在屏幕上不可见。但是,在编写python应用程序时,这似乎不以相同的方式工作。我尝试了几种不同的类似GUI的模块......
  • 【QT】QT 窗口(菜单栏、工具栏、状态栏、浮动窗口、对话框)
    Qt窗口是通过QMainWindow类来实现的。QMainWindow是一个为用户提供主窗口程序的类,继承自 QWidget类,并且提供了⼀个预定义的布局。QMainWindow包含一个菜单栏(MenuBar)、多个工具栏(ToolBars)、多个浮动窗口(铆接部件)(DockWidgets)、⼀个状态栏(StatusBar)和一个中心部件(Cent......
  • 艾尔登法环找不到bink2w64.dll文件怎么处理?《艾尔登法环》弹出“bink2w64.dll没有指定
    《艾尔登法环》弹出“bink2w64.dll没有指定在Windows上运行”窗口时,您别慌。可以尝试重新安装游戏,修复可能损坏的游戏文件。检查系统文件完整性,更新相关驱动程序。同时进行病毒扫描,排除恶意软件干扰。本篇将为大家带来艾尔登法环找不到bink2w64.dll文件处理方法的内容,感兴趣的......
  • Unity学习笔记之Inspector窗口可编辑的变量
     笔记:usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicenumTypeEnum{Normal,Player}[System.Serializable]publicstructMyStruct{publicintages;publicboolsex;}[System.Serializable]publicc......
  • 【selenium】自动化测试小白入门:实现只开一个窗口,不同用户循环登录
    首先,我在给一个审批流写自动化脚本,需要各个不同的人登录去点通过按钮,每个人的流程都一致,唯一的区别就是user不同。那么,我的实现目标是,不关闭browser,只写一个testcase,实现不同用户按顺序运行同一个testcase第一次尝试,在driver里面写[email protected](scope="session")......