单调队列总结

本文详细介绍了单调队列这一数据结构,包括其定义、性质以及如何通过双端队列来实现单调递增和单调递减的队列。在实现部分,提供了具体的代码示例,展示了如何维护队列的单调性,以确保队列内部元素的有序性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单调队列

一、单调队列

1.定义

单调队列就是队内元素保持一定单调性的队列,及从队首到队尾单调递增(单调递增队列)或递减(单调递减队列);

2.性质

  1. 满足队尾到队头入队顺序从早到晚;
  2. 队列中元素的大小从队首到队尾必须是单调递(增,减,自定义);

二、实现

1. 对于单调递增:

思路

使用双端队列模拟,使用结构体存储数字的入队时间与数值,如果队列不为空且当前入队的元素与当前在队首的元素入队时间差小于队列长度,则将队首元素出队,如果队列不为空且入队元素小于队首元素值,则说明入队会破坏队的单调性,因此需要将比入队元素大的元素全部出队,处理完后,将当前入队元素入队;

代码

struct num {
	int i, x;
};
deque < num > q;
void push (int x) {
	if (!q.empty() && q.front().i + k - 1 < i) q.pop_front();
    while (!q.empty() && q.back().x > a[i]) q.pop_back();
    q.push_back( num ( { i, a[i] } ) );
}

2.对于单调递减:

思路

使用双端队列模拟,使用结构体存储数字的入队时间与数值,如果队列不为空且当前入队的元素与当前在队首的元素入队时间差小于队列长度,则将队首元素出队,如果队列不为空且入队元素大于队首元素值,则说明入队会破坏队的单调性,因此需要将比入队元素小的元素全部出队,处理完后,将当前入队元素入队;

代码

struct num {
	int i, x;
};
deque < num > q;
void push (int x) {
	if (!q.empty() && q.front().i + k - 1 < i) q.pop_front();
    while (!q.empty() && q.back().x < a[i]) q.pop_back();
    q.push_back( num ( { i, a[i] } ) );
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值