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

滑动窗口最大值和最小值

题目:

思路:

窗口进行滑动时,需要快速获取min和max,因此需要一个结构来保存最值,而不是临时计算。动态的最值更新容易联想到单调栈,但是这里需要频繁增删元素,因此用双端队列,front删除移除窗口的元素,back增添移入窗口的元素。
创建两个双端队列,一个记录窗口最小值,一个记录窗口最大值。
最小值双端队列中递增排序,首元素就是当前窗口中的最小值。每次窗口移动1位,首先判断位于队首的元素是否被移除窗口,如果是,出队,否则将新元素与队尾元素比较,如果大于队尾元素直接入队,否则将队尾元素出队,直至新元素入队,作为备选的最小值。
最大值双端队列中递减排序,其他操作与最小值双端队列类似。

代码:

#include<iostream>
#include<vector>
#include<deque>
using namespace std;void slidingWindow(const vector<int>& arr, int k, vector<int>& mins, vector<int>& maxs)
{deque<int> min_q, max_q;for (int i = 0; i < arr.size(); i++){//移除不在窗口中的元素while (!min_q.empty() && min_q.front() <= i - k)min_q.pop_front();while (!max_q.empty() && max_q.front() <= i - k)max_q.pop_front();//维护最小值队列while (!min_q.empty() && arr[i] <= arr[min_q.back()])min_q.pop_back();min_q.push_back(i);//维护最大值队列while (!max_q.empty() && arr[i] >= arr[max_q.back()])max_q.pop_back();max_q.push_back(i);//当窗口形成时记录结果if (i >= k - 1){mins.push_back(arr[min_q.front()]);maxs.push_back(arr[max_q.front()]);}}
}int main()
{int n, k;cin >> n >> k;vector<int> arr(n);for (int i = 0; i < n; i++)//获取数组cin >> arr[i];vector<int> mins, maxs;slidingWindow(arr, k, mins, maxs);for (int num : mins)cout << num << " ";cout << endl;for (int num : maxs)cout << num << " ";cout << endl;return 0;
}

 运行结果:

http://www.xdnf.cn/news/13396.html

相关文章:

  • 理解 PostgreSQL 中的 Virtual Transaction ID(VXID)
  • 123123
  • 【Java】动态加载数据库驱动:灵活连接
  • IMX6ULL--EPIT 定时器理论
  • 打卡第41天:训练和测试的规范写法
  • C/C++八股文
  • 面试题 - 日志(Java)
  • 网络爬虫学习心得
  • 智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
  • 二维数组判断空的情况
  • uniapp自定义导航栏,采用粘性定位
  • STM32 PID控制
  • python打卡训练营打卡记录day50
  • 林清轩以研发为核,用专利技术筑就高端国货护肤壁垒
  • 函数02 day11
  • AI赋能农业
  • 第十六章 I2C
  • 【PhysUnits】17.6 Unit基础结构(unit.rs)
  • <component :is=““>
  • CentOS7下的ZooKeeper部署
  • 55. Jump Game
  • Redis持久化策略介绍,以及如何选择?
  • 第二十四章 通用同步异步收发器(USART)
  • java异步编程难题拆解
  • Java 中 switch-case 语句的执行逻辑与避坑指南
  • Java判断规则工具类
  • 工作日记总结-transaction is aborted, commands ignored until end of transaction block
  • [软件测试]:什么是自动化测试?selenium+webdriver-manager的安装,实现你的第一个脚本
  • Kotlin基础语法二
  • 大数据学习(136)-数据埋点