什么是单调栈
一个从栈顶到栈底元素大小有序的栈
单调栈的优势
效率高:每个元素只进栈一次,出栈一次,所以时间复杂度是(O(N)).
什么时候用单调栈(单调栈的特点)
那单调递增(减)栈举例,对于数组中的某个元素,单调栈能在平均(O(1))的时间找到离自己最近的比自己小(大)的两个元素(左边一个,右边一个),我通常在数组开头和结尾放一个INT_MIN(INT_MAX)
,这样就不用处理边界情况。
(递增为例)如何找到离自己最近的比自己小的两个元素?
对于数组元素b,如果栈顶元素t小于b,那么t就是离b最近的左边的小元素,否则弹栈,直到找到小于b的元素,b入栈。这就是说:b入栈时可以得到b左边最近的小元素。
继续对数组遍历,如果遍历到的元素大于b就压栈,直到某元素c小于b,b出栈。这就是说:b出栈时可以得到b右边最近的小元素。
典型题目 leetcode 84
对于某个柱子b,如果我想知道以a的高度为高的最大矩形怎么办?根据上面我们说的,如果用单调递增栈,我们可以快速得到离b最近的且比b低的两个柱子(左边为a,右边为c)。得到之后呢?因为a是b左边第一个比b低的柱子,言外之意是,a,b之间的柱子都比b要高,既然都比b高,那么就可以作为以b的高度为高的矩形的一部分,右边同理。那么最后,a和c之间的距离就是以b的高度为高的矩形的底边长度。