# README
montonic_stack 有性质: O(n)的时间内, 找到左右点,的 左边和右边的边界。(第一个比当前数,大或者小的数的下标) 那么 montonic_queue 有什么样的性质呢? 单调队列,是不是常常和 sliding window 联系起来?
Pecco: 对于 单调队列的解释: “如果一个选手比你小还比你强,你就可以退役了。”——单调队列的原理 https://zhuanlan.zhihu.com/p/346354943
下面是chatgpt 的总结, 还没遇到太多 montonic_queue 的问题, 到时候有储备了自己总结性质和 template code
单调队列是一个支持从队列两端插入和删除元素的数据结构,并且保持队列内元素的单调性。单调队列主要用于解决滑动窗口类型的问题,其中队列中维护当前窗口内具有单调性(单调递增或递减)的元素序列。
单调队列的性质如下:
单调性维护:与单调栈类似,单调队列强调队列内部元素的单调性。对于单调递增队列,队列前端维护的是最小值,而后端会剔除所有大于新加入元素的既有元素,以保持队列的递增性。相反的,单调递减队列前端维护的是最大值,后端会剔除所有小于新插入元素的元素。
滑动窗口最值问题:单调队列可以在O(1)时间复杂度下快速访问当前窗口的最大值或最小值,这对于处理如求给定数组中所有滑动窗口的最大值或最小值等问题非常有用。
双端操作:单调队列支持在队头和队尾进行元素的添加和删除操作,这在处理滑动窗口移动时特别重要。也就是说,当滑动窗口向右移动时,我们可能需要在队尾加入新的元素,而从队头移除离开窗口的旧元素。
元素索引的存储:在实际操作时,单调队列存储的通常是元素在原数组中的索引而非值本身。这样可以方便地知道队列前端的元素是否已经超出了滑动窗口的范围,同时可以快速访问元素的值。
动态更新:当新元素加入队列时,会动态地更新队列以维持其单调性。这可能涉及到移除队尾的一个或多个元素,确保新元素的插入不会破坏队列的单调性。
高效性:由于单调队列对元素进出进行了优化,使得在处理滑动窗口问题时具有非常高的效率,通常每个元素只被加入和移除队列各一次,因此算法的时间复杂度往往可以达到O(n),n为元素个数。
总结而言,单调队列非常适合用于处理滑动窗口内最值问题,能够在关注窗口内容变化的同时,快速回答当前窗口状态的问题。