滑动窗口(cpp)

滑动窗口算法通过维护一个单调队列,可以在O(1)的时间复杂度内找到窗口内的最小值,整体复杂度为O(n)。在遍历过程中,删除冗余元素,保持队列单调递增,队头即为当前窗口的最小值。这种算法适用于求解窗口最值问题,且能快速找到相邻元素的大小关系。
摘要由CSDN通过智能技术生成

滑动窗口

维护队列 满足一个单调性
找窗口中的最小值: 3 -1 -3
后边一个元素比当前元素小的话,当前元素就没用了,冗余元素 删掉。
当遍历完整个数组 所有的冗余元素都删掉了, 剩下的就是一个单调递增的序列。
具有单调性方便: 在遍历时就维护了, 取当前窗口的队头即可,就是最小值
每次 O(1)的复杂度 , 整体的复杂度就是O(n)的

  • 将队列中的没有用的元素删掉一>具有 了单调性
  • 可以用0(1)时间从队头/队尾取出最值

这个做法算法,稳健,可以找到当前窗口最值 或找出离他最近的比他大/小的第一个数
窗口长度为k 所以, 队头出队,队尾入队, hh = 0队头, tt = -1 队尾 a[++tt] = x;
[队头,队尾]
[i - k + 1, i ]

code:

#include <iostream>
using namespace std;

const int N = 1000010;
int a[N], q[N], hh, tt = -1;

#define IOS ios::
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值