单调栈和单调队列
-
有什么作用 ?
以递增的单调栈为例,单调栈可以找到右边第一个比它大的值的位置。而单调队列基本上只是规定了长度的单调栈,(而由于栈/队列中最右边的一定是最大的元素,)自然而然的单调队列也可以找到区间的最大值,并且通过滑动来实现找规定长度区间的最大值。(一些废话:虽然st表或者线段树之类的也能实现类似的功能,但也不能每次改变要找的不同数组的区间就建立一遍吧,多麻烦啊,况且还复杂度低 ^_^ )。
-
是如何实现的
单调栈和单调队列中储存的都是下标,每次更新,都是用当前的元素来更新 栈/队列 中的东西。
比如,对于单调栈来说,先把栈顶的比当前元素小的都取出来,并且当前的元素就是是右边第一个比栈顶取出元素大的东西,可以用一个数组记下来,再把当前元素由栈顶放进去。
对于单调队列来说,为了维护区间固定的长度,除了上述的操作之外,需要用队头的下标来防止队列涉及的区间长度太长,例如 如果队列队头的位置与当前的元素的位置差太大,表明需要把队头的这个元素排出去,这样,可以让队列中涉及的元素都是固定长度的区间的