单调栈:就是在栈中实现数据的单调性。即从栈底到栈顶,要么递增,要么递减。
那么,使用单调栈,可以解决什么问题呢?
给定一个可能含有重复值的数组arr,i位置的数一定存在如下两个信息
1)arr[i]的左侧离i最近并且小于(或者大于)arr[i]的数在哪?
2)arr[i]的右侧离i最近并且小于(或者大于)arr[i]的数在哪? 如果想得到arr中所有位置的两个信息,怎么能让得到信息的过程尽量快
题目一:给定一个一维数组,数据都为正整数并且无重复值,要求设计一个O(N)时间复杂度的算法,找出任意位置的数据,左侧小于当前位置最近的数在哪,右侧小于当前数最近的的数在哪?
假设: 这个数组是 {1,3,5,4}。栈的单调性从栈底到栈顶递增。
那么如下:
5 |
3 |
1 |
也就是说,前3个数符合预期的栈的单调性,可以正常的放入栈中。那么,当最后一个数据4想要放入栈中的时候,发现栈顶元素为5,比自己大。直接放入就破坏了栈的单调性了。
1. 我们需要把栈顶元素5弹出,这5就知道右侧小于自己的并且距离最近的数为4,而左侧离自己最近并且小于自己的数为3.
2. 此时,栈顶元素为3,小于4. 那么4直接放入栈顶。整个数组全部结束
4 |
3 |
1 |
3. 栈循环弹出,4