当前位置: 首页 > 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.dtcms.com/a/299038.html

相关文章:

  • Javaweb————什么是超文本传输协议?
  • 机器学习特征工程详解:特征选择与降维(PCA)
  • 好的编程语言设计是用简洁清晰的原语组合复杂功能
  • Java 问题排查之工具单
  • MCP协议深度解析:客户端-服务器架构的技术创新
  • 零基础 “入坑” Java--- 十四、【练习】图书小系统
  • 力扣---------238. 除自身以外数组的乘积
  • mysql group by 多个行转换为一个字段
  • Java动态调试技术原理
  • Oracle 11g RAC数据库实例重启的两种方式
  • 机器学习——随机森林算法分类问题案例解析(sklearn)
  • SpringMVC——建立连接
  • Python高级入门Day6
  • (React入门上手——指北指南学习(第一节)
  • Earth靶机攻略
  • 公域流量向私域流量转化策略研究——基于开源AI智能客服、AI智能名片与S2B2C商城小程序的融合应用
  • 分治算法 (Divide and Conquer)原理、及示例-JS版
  • 告别配置混乱!Spring Boot 中 Properties 与 YAML 的深度解析与最佳实践
  • C++查询mysql数据
  • linux下变更mysql的数据文件目录
  • CentOS 7 安装 MySQL 8.4.6(二进制包)指南
  • 基于MySQL实现基础图数据库
  • Day04–链表–24. 两两交换链表中的节点,19. 删除链表的倒数第 N 个结点,面试题 02.07. 链表相交,142. 环形链表 II
  • GMP模型
  • 背包问题及 LIS 优化
  • 口腔助手|口腔挂号预约小程序|基于微信小程序的口腔门诊预约系统的设计与实现(源码+数据库+文档)
  • vue子组件关闭自己的方式(事件触发)
  • 上证50指数分红和股指期货有什么关系?
  • MybatisPlus-18.插件功能-分页插件基本用法
  • Vue3 学习教程,从入门到精通,Vue3 样式绑定语法详解与案例(17)