单调栈的作用是能够在一次遍历的情况下找到每个元素最左边或者最右边的第一个最大/小元素,得益于其独特的栈结构,我们可以通过手动维护一个非递增/递减的栈完成这个目的。
单调栈一共分为四种情况:
注意,这四种情况我们都可以从左向右遍历数组完成。有的时候为了方便计算边界情况的差值,可以压入dummy节点(例如美丽塔2),问最大我们压入INT_MAX。最小INT_MIN
1.找到每个元素左边的第一个最大元素
从左向右遍历数组,如果是901题这种要求即使计算,不会一次给出数组的,还需要用pair存好索引以及当前值。当新出现的元素大于栈顶元素的时候,令栈顶元素出栈,直到遇到比自己大的元素。注意这个是实时结算的,找到的结果是栈中之前存放的值
2.找到每个元素左边的第一个最小元素
同理,我们维护单调递增的栈即可
3.找到每个元素右边的第一个最大元素
从左向右遍历数组,遇到新元素大于栈顶元素,就出栈,直到栈中元素大于新元素。这个非实时结算,当后面遇到了满足条件的新元素,才更新栈中存放的之前的元素,也就是说为之前的元素找到了答案而非新遇到的元素
4.找到每个元素右边的第一个最小元素
同理,维护单调递增的栈即可