滑动窗口的最小值问题

滑动窗后的最小值问题。输入正整数k和一个长度为n的整数序列A1,A2,A3,…,AnA_1, A_2, A_3, … , A_n。定义f(i)f(i)表示从元素ii开始的连续kk个元素的最小值,即f(i)=min{Ai,Ai+1,…,Ai+k−1}f(i)=min\{A_i, A_{i+1},…, A_{i+k-1}\}。要求计算f(1),f(2),f(3),…,f(n−k+1)f(1), f(2), f(3),…, f(n-k+1)。例如,对于序列5,2,6,8,10,7,4,k=45, 2, 6, 8, 10, 7, 4,k=4,则f(1)=2,f(2)=2,f(3)=6,f(4)=4f(1)=2, f(2)=2, f(3)=6, f(4)=4。


假设窗口中有两个元素1和2,且1在2的右边,这意味着2如果和1在同一个窗口,2永远不可能成为最小值。换句话说,这个2是无用的,应当及时删除。当删除无用元素之后,滑动窗口中的有用元素从左到右是递增的。为了叙述方便,习惯上称其为单调队列。在单调队列中求最小值很容易:队首元素就是最小值。

当窗口滑动时,首先要删除滑动前窗口的最左边元素(如果是有用元素),然后把新元素加入单调队列。注意,比新元素大的元素都变得无用了,应当从右往左删除。如图所示是滑动窗口的4个位置所对应的单调队列。

实现代码

#include <iostream>
#include <queue>
using namespace std;
int main() {int a[] = {5, 2, 6, 8, 10, 7, 4};int k = 4;int n = 7;// 实现单调队列deque<int> dq;for(int i = 0; i < n; i++) {if(i >= k) {// 输出单调队列队首元素,该元素即为移动前滑动窗口的最小值cout << dq.front() << " ";// 如果移动到当前滑动窗口位置后,出去的元素恰好是单调队列最小元素,则出队它if(a[i - k] == dq.front()) {dq.pop_front();}}// 队列不为空且队列中最后的元素大于当前元素// 将队列最后元素出队// 因为它不可能成为最小元素了while(!dq.empty() && dq.back() > a[i]) {dq.pop_back();}// 当前元素入队dq.push_back(a[i]);}cout << dq.front() << endl;return 0;
}

输出数据

2 2 6 4Process returned 0 (0x0)   execution time : 0.052 s
Press any key to continue.

滑动窗口的最小值问题相关推荐

  1. pandas计算滑动窗口中的最小值实战(Rolling Minimum in a Pandas Column):计算单数据列滑动窗口中的最小值、计算多数据列滑动窗口中的最小值

    pandas计算滑动窗口中的最小值实战(Rolling Minimum in a Pandas Column):计算单数据列滑动窗口中的最小值.计算多数据列滑动窗口中的最小值 目录

  2. 单调队列板子:求滑动窗口中最大值和最小值

    文章目录 题目分析 初始思路 单调队列优化的思路 代码1:数组模拟单调队列的代码 代码2:deque容器实现 能用到单调队列的情景比较有限: 1.典型的有滑动窗口的最值, 2.找到里它最近的比它大(小 ...

  3. 求滑动窗口中的最大值和最小值

    滑动窗口: 一般使用双指针算法,左指针l和右指针r之间的空间称为窗口,由于指针是不断移动的,从而窗口也可以移动,称为滑动窗口. 滑动窗口的最值: 由于窗口是移动的,移动的过程中有新元素的加入也有旧元素 ...

  4. 滑动窗口(最大最小值)的经典例题

    滑动窗口简单概念 滑动窗口是我们假想出的一种数据结构,我们在这篇文章实现的窗口,能较快速的求区间最大最小值 在一些区间不回退的题目中运行效率也十分优秀 设窗口的左边界为l,右边界为r,(规定l< ...

  5. 你还在为 TCP 重传、滑动窗口、流量控制、拥塞控制发愁吗?看完图解就不愁了...

    每日一句英语学习,每天进步一点点: 来自:小林coding 前言 前一篇「硬不硬你说了算!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题」得到了很多读者的认可,在此特别感谢你们的认可, ...

  6. LeetCode 滑动窗口(Sliding Window)类问题总结

    导语 滑动窗口类问题是面试当中的高频题,问题本身其实并不复杂,但是实现起来细节思考非常的多,想着想着可能因为变量变化,指针移动等等问题,导致程序反复删来改去,有思路,但是程序写不出是这类问题最大的障碍 ...

  7. java 滑动窗口_【Java】 剑指offer(59-1) 滑动窗口的最大值

    本文参考自<剑指offer>一书,代码采用Java语言. 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1 ...

  8. 滑动窗口的最大值java

     题目描述:   给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4 ...

  9. LeetCode Contains Duplicate III(滑动窗口)

    问题:给出一个数组,要求  思路:第一种方法使用枚举法,对于i,则判断[0,i-k]之间的数与nums[i]的绝对值是否小于等于t. 第二种方法基于set的滑动窗口.在遍历数组时,先看集合中比当前遍历 ...

最新文章

  1. 一个简单的程序来使用WiredTiger 存储引擎
  2. 理解SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt
  3. python怎么画出圆润的曲线_利用python画出AUC曲线的实例
  4. django 学习 (四) 模板标签
  5. python vector 初始化_从零开始搭建机器学习算法框架(python)--计算框架
  6. 性能测试工具Gatling
  7. STL stack 容器
  8. cmake取消宏定义_魔兽怀旧服,牧师实用宏
  9. 高速掌握Lua 5.3 —— 扩展你的程序 (1)
  10. java socket 简书_Java之Socket编程入门篇
  11. MAC编译OpenJDK8:error: ‘‘ within ‘||‘ [-Werror,-Wlogical-op-parentheses]
  12. 递归删除文件和删除文件夹
  13. 钢绞线的弹性模量的计算方法_钢绞线弹性模量的理论计算及其影响因素分析
  14. ubuntu 10.04 下安装 wine 所得所获【转】
  15. 中文汉字错别字纠错方法
  16. 第四章网络安全学习笔记(超详细)
  17. 进行ui设计培训学费是多少
  18. 三人表决器与八人抢答器实验
  19. java netty教程_Java NIO框架Netty教程(一) – Hello Netty
  20. RGB图像转换为BGR

热门文章

  1. 2019国内某知名科技公司技术资料
  2. openlayers4 入门开发系列之地图工具栏篇(附源码下载)
  3. 【大学物理】磁场的高斯定理
  4. Mac版钉钉之一个新的技术electron
  5. 使用node的pm2管理相关进程
  6. js执行环境作用域和闭包_JavaScript中执行上下文,提升,作用域和闭包的终极指南
  7. 编写react组件_如何编写第一个React.js组件
  8. di-tech2016_2016年Tech最佳愚人节笑话
  9. 使用Express和MongoDB构建CRUD应用程序-第2部分
  10. 两种方式实现word转markdown