单调栈 就是栈内元素满足单调性的栈结构。此处的单调性分为单调递增与单调递减。
如何维护一个单调栈:
单调递增栈:在保持栈内元素单调递增的前提下(如果栈顶元素大于要入栈的元素,将将其弹出),将新元素入栈。
单调递减栈:在保持栈内元素单调递减的前提下(如果栈顶元素小于要入栈的元素,则将其弹出),将新元素入栈。
什么时候使用单调栈:
1、给定一个序列,求序列中的每一个数左边/右边第一个比他小/比他大的数;
2、给定一个序列,求序列中的每一个数左边/右边第一个比他小/比他大的数在什么地方。上面的动图,可以求序列中的每个数字左边第一个比他小的数的位置。注意:寻找位置时(下标时),栈存储的是下标,而不是数值。
单调队列就是有某种单调性的队列,没错,这就是所谓的单调队列。单调队列它分两种,一种是单调递增的,另外一种是单调递减的。
百度百科的解释:不断地向缓存数组里读入元素,也不时地去掉最老的元素,不定期的询问当前缓存数组里的最小的元素。
用单调队列来解决问题,一般都是需要得到当前的某个范围内(连续的字序)的最小值或最大值。
队列中元素之间的关系具有单调性,且队首和队尾都可以进行出队操作,只有队尾可以进行入队操作。
用处:
对于维护好的单调队列,对内元素是有序的,那么取出最大值(最小值)的复杂度为O(1)。可以拿来优化DP(…)。
单调队列:通俗的讲就是以一个固定长度的窗口在数列上移动,(这个固定的长度是题目给的,队首元素在队列中的位置与队尾元素在队列的位置之差若大于这个固定长度,就得将队首元素弹出)。
单调栈与单调队列总结:
(1)先用栈/队列来暴力模拟问题。
(2)观察栈/队列中哪些元素是没有用的,将这些没有用的数全部删掉。
(3)剩下的元素具有单调性就可以进行优化。