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

【AcWing 154题解】滑动窗口

AcWing 154. 滑动窗口
【题目描述】
在这里插入图片描述
【输入输出样例】
在这里插入图片描述
在查看解析之前,先给自己一点时间思考哦!
天津之眼
【题解】
题目要求给定一个大小为n的数组,并且有一个大小为k的滑动窗口。窗口每次向右移动一个位置,要求计算窗口中的最大值和最小值。为了解决这个问题,我们可以使用双端队列的方式来优化滑动窗口的最大值和最小值查询。

双端队列的应用:利用双端队列来保持一个递减递增的窗口。具体来说:
最大值:保持队列中元素的下标递减,从队列前面获取窗口的最大值。
最小值:保持队列中元素的下标递增,从队列前面获取窗口的最小值。

窗口的滑动:每次滑动窗口时,我们需要:
将新元素添加到队列,并维护队列中的元素顺序(递减或递增)。
移除已经不在当前窗口中的元素。
效率:每个元素最多进入队列一次,且最多被删除一次,因此时间复杂度为O(n)O(n)O(n)
【参考代码】

#include <iostream>
using namespace std;const int N = 1e6 + 10;  // 定义最大数组长度
int a[N], q[N];  // a存储数组,q存储队列(用来存储窗口中元素的索引)
int n, k;int main() {cin >> n >> k;  for(int i = 0; i < n; i++)  cin >> a[i];// 计算每个窗口中的最小值int hh = 0, tt = -1;  // 队列的头部和尾部指针for(int i = 0; i < n; i++) {// 移除不在窗口中的元素if(hh <= tt && i - k + 1 > q[hh])hh++;// 维护递增队列,移除队列中所有比当前元素大的元素while(hh <= tt && a[q[tt]] >= a[i])tt--;// 将当前元素的下标加入队列q[++tt] = i;// 输出当前窗口的最小值if(i >= k - 1)cout << a[q[hh]] << " ";}cout << endl;// 计算每个窗口中的最大值hh = 0, tt = -1;  // 重置队列的头尾指针for(int i = 0; i < n; i++) {// 移除不在窗口中的元素if(hh <= tt && i - k + 1 > q[hh])hh++;// 维护递减队列,移除队列中所有比当前元素小的元素while(hh <= tt && a[q[tt]] <= a[i])tt--;// 将当前元素的下标加入队列q[++tt] = i;// 输出当前窗口的最大值if(i >= k - 1)cout << a[q[hh]] << " ";}cout << endl;return 0;
}
http://www.lryc.cn/news/601008.html

相关文章:

  • 【音视频协议篇】WebRTC 快速入门
  • 嵌入式硬件篇---zigbee无线串口通信问题
  • 谷歌无法安装扩展程序解决方法(也许成功)
  • 【C++】stack和queue的模拟实现
  • 机器学习的工作流程
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-30,(知识点:传输线特性阻抗,影响因素)
  • Avantage6.6下载与安装教程
  • 瑞吉外卖学习笔记
  • 兼容性问题记录
  • 亚马逊测评采购:如何打造安全的环境,技术基础关键
  • Python点阵字生成与优化:从基础实现到高级渲染技术
  • JavaScript 立即执行函数(IIFE)运行时行为分析笔记
  • golang实现一个规则引擎,功能包括实时增加、修改、删除规则
  • GO 从入门到精通2
  • 什么是缓存雪崩?缓存击穿?缓存穿透?分别如何解决?什么是缓存预热?
  • 编程语言Java——核心技术篇(四)集合类详解
  • 【Pandas】pandas Index objects Index.shape
  • 【595驱动8*8点阵】2022-9-11
  • Linux文件系统管理——NFS服务端的安装配置与NFS客户端的安装与挂载实操教程
  • QT核心————信号槽
  • MyBatis-Plus 进阶功能:分页插件与乐观锁的实战指南
  • org.apache.lucene.search.Query#rewrite(IndexSearcher)过时讲解
  • 框架式3D打印机结构设计cad【9张】三维图+设计说明书
  • Windows Server存储池,虚拟磁盘在系统启动后不自动连接需要手动连接
  • vulhub Earth靶场攻略
  • Java:采用mybatis+pagehealper优雅的实现分页功能
  • 文件操作认识
  • connect系统调用及示例
  • 使用Python实现单词记忆软件
  • 零基础学习性能测试第三章:jmeter性能组件应用(事件,并发,定时器)