【c++】单调队列(超详细)

什么叫单调?
• 一些数据从小到大排列 —— 单调递增
• 从大到小排列 —— 单调递减


单调队列
• 单调递增的队列:在队列的基础上,时刻保持队列中的元素单调递增。
• 单调递减的队列:在队列的基础上,时刻保持队列中的元素单调递减。


怎么做到?
• 除了队首可以出队外,新增一个在队尾出队的操作;
• 新元素要进队,先让不满足单调性的元素从队尾出队。

举个例子
• 元素是整数,单调递增的队列,允许重复元素
• 一开始是个空队列
• 数字 3进队                                 空队列,直接进队
• 数字 5进队                                 能保持单调性,直接进队
• 数字 8进队                                 能保持单调性,直接进队
• 数字 5进队                                 不能保持单调性,先将 8出队,再让 5进队
• 出队                                            数字 3出队
• 数字 9进队                                 能保持单调性,直接进队
• 数字 4进队                                 先让 5,5,9 都出队,再让 4进队
• 出队                                           数字 4出队

单调队列需要用到一个用C++ 自带的双端队列 deque,它可以从队首和队尾加入或删除元素。

deque<int> q;

性质 1:
• 一个元素进队时,从队尾删除了一些元素
• 删完后,自己入队之前,“先进队的元素中最后一个比自己小的”恰好在队尾
• 性质 2:
• 一个元素进队时,从队尾删除了一些元素
• 自己是它们的“后进队的元素中第一个比自己小的”

例题:

nkoj 2152

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Python的单调队列是一种用于解决某些特定问题的数据结构。它是队列的一种变体,可以快速查询当前队列中的最大或最小元素。 单调队列通常用于需要维护当前滑动窗口中的最大或最小值的情况。例如,假设我们有一个长度为n的数组arr和一个窗口大小为k的滑动窗口。我们想要找到每个窗口中的最大值。单调队列就可以帮助我们在O(n)的时间复杂度内实现。 实现单调队列需要两个操作:push(x)和pop()。push(x)用于向队列的尾部添加元素x,而pop()用于从队列的头部删除元素。这两个操作具有O(1)的时间复杂度。 当我们向队列中添加一个新元素时,为了维护队列的单调性,我们需要从队列的尾部删除一些元素。具体来说,我们从队列的尾部开始,不断地删除比新元素小的元素,直到队列为空或者新元素大于等于队列尾部元素为止。这样,我们就可以保证队列中的元素是以递减顺序排列的。 当我们需要查询当前队列中的最大或最小值时,只需访问队列头部的元素即可。由于队列中的元素是以递减的顺序排列的,所以头部元素就是最大值(或最小值)。 总的来说,Python的单调队列是一种高效的数据结构,可以用于解决一些特定问题,如滑动窗口中的最大(或最小)值。它具有O(n)的时间复杂度,并且可以通过push(x)和pop()操作来维护队列的单调性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hear the Wind Sing.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值