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

算法题(182):滑动窗口

审题:

本题需要我们找到长度为n的窗口从左到右滑动到所有位置的窗口内最大值与最小值并输出

思路:

方法一:单调双端队列

我们创建一个双端队列并按照以下规则进行操作即可筛选出每一个窗口的最大值/最小值

a数组:记录初始数据的数组

以查找最大值为例:

1.当a[i]>=a[q.back()]:将队列尾部索引数据弹出

2.当a[i]<a[q.back()]:将当前索引插入队列

3.当队头数据已经不在当前窗口内时:弹出队头索引数据

4.当i>=k:输出队头索引数据对应a数组的数据值

疑问:

操作1:因为当前遍历到的数据已经比队尾数据的值要大,所以该队尾数据不可能是后续窗口的最大值,直接弹出即可。

若两者相等,也是弹出,因为后续遍历过程会把先出现的数据淘汰掉

操作2:因为后续计算队头是否还在窗口内需要用到索引,所以我们不存储数据值,而是存储他在a数组的索引

操作3:通过队头和队尾的差值来计算

操作4:需要保证窗口完整出现后才输出

解题:

#include<iostream>
#include<deque>
using namespace std;
const int N = 1e6 + 10;
int n, k;
int a[N];
int main()
{cin >> n >> k;for (int i = 1; i <= n; i++) cin >> a[i];//查找最小值deque<int> q;for (int i = 1; i <= n; i++){while (q.size() && a[i] <= a[q.back()]) q.pop_back();q.push_back(i);if (q.back() - q.front()+1 > k) q.pop_front();if (i >= k) cout << a[q.front()] << " ";}//查找最大值cout << endl;while (q.size()) q.pop_back();for (int i = 1; i <= n; i++){while (q.size() && a[i] >= a[q.back()]) q.pop_back();q.push_back(i);if (q.back() - q.front() +1 > k) q.pop_front();if (i >= k) cout << a[q.front()] << " ";}return 0;
}

注意:

1.在调用队列的back等函数前需要确保队列不为空,所以在不确定数据量的使用前需要加一个q.size()的判断

2.最后输出的是数据值本身,所以需要用a[q.front()]

http://www.dtcms.com/a/319046.html

相关文章:

  • mysql基础-分组查询
  • 全面解析 URL 重定向原理:从协议、实现到安全实践
  • 【物联网】基于树莓派的物联网开发【24】——树莓派安装influxDB时序数据库
  • 套接字编程UDP
  • Android-Kotlin基础(Jetpack③-LiveData)
  • 数据结构初阶(4)栈
  • Python生成统计学公式
  • 数据结构:双向链表(Doubly Linked List)
  • 快速搭建开源网页编辑器(vue+TinyMCE)
  • 大屏数据展示页面,数据可视化可以用到的框架和插件
  • 剧本杀小程序系统开发:推动社交娱乐产业创新发展
  • requests模块
  • Web3.0引领互联网未来,助力安全防护升级
  • 基于django的非物质文化遗产可视化网站设计与实现
  • 重学React(三):状态管理
  • Java如何快速实现短信登录?
  • 【指南版】网络与信息安全岗位系列(三):安全运维工程师
  • 农作物优选,耕耘希望的田野
  • Vue3获取当前页面相对路径
  • 008 前端vue
  • Android-Kotlin基础(Jetpack①-ViewModel)
  • 【遥感图像入门】近三年遥感图像建筑物细粒度分类技术一览
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第七天(Vue)(二)
  • Tiger任务管理系统-10
  • vue打包号的文件如何快速查找文件打包后的位置
  • 聚水潭API数据接口开发手机端网页查询商品仓位库位库存工具,支持扫描识别,预览图片
  • Numpy科学计算与数据分析:Numpy线性代数基础与实践
  • 决策树技术详解:从理论到Python实战
  • RabbitMQ-日常运维命令
  • 华为开源CANN,再次释放“昇腾转向”信号