首页 > 其他分享 >154. 滑动窗口

154. 滑动窗口

时间:2023-09-27 20:11:06浏览次数:36  
标签:下标 154 int 队列 数组 滑动 窗口

154. 滑动窗口

题目链接:154. 滑动窗口 - AcWing题库

1、暴力枚举

窗口大小为k
序列长为n

以求最小值为例
f[i] 表示以i结尾的窗口中的最小值
f[i] = min(a[j]) , i - k + 1 <= j <= i
    
for: i = 1 ~ n
    for: j = i - k + 1 ~ i 
        f[i] = min(a[j])

2、单调队列 用数组模拟队列

参考视频:411【模板】单调队列 滑动窗口最值_哔哩哔哩_bilibili

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;

int q[N], a[N];  //q队列存储元素的下标 方便判断对头出队 a存储数组元素
   

int main()
{
    int n, k;
    cin >> n >> k;
    for(int i = 1; i <= n; i++)
       	cin >> a[i];
   	
    //维护窗口最小值
    int h = 1, t = 0;
    for(int i = 1; i <= n; i++)
    {
        while(h <= t && a[q[t]] >= a[i])  t--; //队尾出列(队列不空 h <= t 且新元素更优 a[q[t]] > a[i])
        q[++t] = i; //队尾入队 (存储下标 方便判断队头出队)
        if(q[h] < i - k + 1)  h++;  //队头出列 (队头元素滑出窗口)
        if(i >= k)		//使用最值
            cout << a[q[h]] << " ";
    }
    
    //维护窗口最大值
    h = 1, t = 0;
    
    for(int i = 1; i <= n; i++)
    {
        while(h <= t && a[q[t]] <= a[i]) t--;
        
        q[++t] = i;
        if(q[h] < i - k + 1) h++;
        if(i >= k)
           	cout << a[q[h]] << " ";
    }
    
    return 0;
}

其他细节问题:

​ 1、h, t的初始化是与数组第一个值下标有关的:

​ h≤数组第一个下标 (如数组从0开始,h≤0;数组从1开始,h≤1,可以是1/0/-1等等)

​ 2、对于数组第一个值下标从0还是从1开始,还会影响输出时的if判断,需要对应修改:

​ 下标从0开始,就是i>=k-1,因为第一个窗口为0 1 2;

​ 下标从1开始,就是i>=k,因为首个窗口是1 2 3

​ 3、维护最小值就是维护窗口内的升序子序列, 维护最大值就是维护窗口内的降序子序列

标签:下标,154,int,队列,数组,滑动,窗口
From: https://www.cnblogs.com/encore051/p/17734221.html

相关文章

  • 分析函数(窗口函数)
    一、什么是分析函数:分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。   基本语法:<窗口函数>over(partitionby<用于分组的列名>                       ......
  • Dynamic CRM弹出自定义窗口的两种方式
    一、Xrm.Internal.openDialog方式1letparams={'param1':param1,'param2':param2};23varDialogOption=newXrm.DialogOptions;45DialogOption.width=750;6DialogOption.height=550;7//参数一:URL,参数二:窗体配置,参数三:Json参数,参数四:......
  • 27、Flink 的SQL之SELECT (Group Aggregation分组聚合、Over Aggregation Over聚合 和
    文章目录Flink系列文章一、GroupAggregation分组聚合1、count示例2、groupby的聚合示例3、distinct聚合4、GROUPINGSETS1)、ROLLUP2)、CUBE5、Having二、OverAggregation1、语法1)、ORDERBY2)、PARTITIONBY3)、RangeDefinitions4)、RANGEintervals5)、ROWintervals2、示例三、......
  • 27、Flink 的SQL之SELECT (窗口聚合)介绍及详细示例(4)
    文章目录Flink系列文章一、WindowTVFAggregation1、WindowingTVFs窗口函数1)、TUMBLE滚动窗口示例2)、HOP滑动窗口示例3)、CUMULATE累积窗口示例2、GROUPINGSETS分组集介绍及示例1)、ROLLUP介绍及示例2)、CUBE介绍及示例3、SelectingGroupWindowStartandEndTimestamps4、Cas......
  • 27、Flink 的SQL之SELECT (窗口函数)介绍及详细示例(3)
    文章目录Flink系列文章一、Windowingtable-valuedfunctions(WindowingTVFs)1、TUMBLE滚动窗口1)、示例1-使用滚动窗口查询、统计(表不含主键)2)、示例2-使用滚动窗口查询、统计(表含主键)3)、官方示例-使用滚动窗口查询、统计(未验证)2、HOP滑动窗口1)、示例1-使用滑动窗口查询、统计2)......
  • (十五)Unity性能优化-Stats(统计数据窗口)
    通过Stats窗口可以初步查看游戏运行时,当前一帧的各项性能。Stats是英文单词Statistics的缩写,意思是“统计数据”。打开方法:Game窗口右上角,找到Stats,点击它。Audio表示音频的数据Level表示声音强度,单位是分贝,也就是dB。声音太大或太小都会影响玩家体验。应将这项数据......
  • Python的Selenium库:鼠标滚动和操作弹出窗口
    Selenium是一个用于自动化web应用测试的开源工具。通过Selenium,我们可以模拟真实用户的操作,如点击、输入、滚动页面等,来测试web应用的稳定性和可靠性。PythonSelenium库是Selenium的一个分支,可以方便地与Python语言结合使用。在PythonSelenium库中,元素定位和文本输入是最常用的......
  • 论关于命令行窗口“cmd”常用指令&&指令大全
    时间:2023-09-25CMD全称“command”,即命令提示符,是内置在windows图形操作系统内的磁盘操作系统,通过CMD可以方便用户查询比较复杂的信息或快速查找实现某些功能等,比如说打开文件、系统设置等操作,如果可以熟练使用的话,能够大大的提高使用电脑的效率。命令行窗口,又称......
  • Qt窗口和视口解析(转)
    目录坐标变换流程世界坐标、窗口坐标和设备坐标窗口和视口世界变换和窗口视口变换QWidget、QGraphicsItem、QGraphicsView绘图窗口与视口绘图测试 坐标变换流程  QPainter.drawRect(QRectF)绘制图形传入的是世界坐标,而后经过变换矩形变为窗口坐标,最后经过窗口-视......
  • c# 调用exe 公共方法封装 无窗口 获取返回值
    调用方法如下varexec=newProcessCommandBase("test.exe");exec.AddParameter("listvms");varresult=exec.Exec(true);完整帮助类如下publicclassProcessCommandBase:IDisposable{//程序名publicstring......