单调栈有两种类型
- 允许重复数字
- 不允许重复数字
他的功能可以描述为getNearLess,找到最近的比他小的位置
单调栈中只存下标,辅助来找到NearLess,具体来说如果栈顶下标代表的值一直大于当前值就一直弹出直到栈变为空
单调栈的处理结果是一个二维数组,每个小数组是一个pair代表左边右边NearLess的下标,不存在则为-1
处理流程:
- 原数组无重复元素
- 遍历整个数组,依次进行压栈操作
- 弹出栈顶比当前值大的,这些位置的右边界确定了
- 弹出的过程中,每弹出一个栈顶,填一个nearLess
- 左边界是剩下中的栈顶,如果栈空了,左边界-1
- 右边界就是现在要压栈的值
- 当前值压栈
- 弹出栈顶比当前值大的,这些位置的右边界确定了
- 所有值都进行过压栈操作后,依此弹出栈中剩余的值
- 左边界是剩下中的栈顶,如果栈空了,左边界-1
- 他们的右边界都是-1,他们右边没有比他们小的数
- 遍历整个数组,依次进行压栈操作
- 原数组有重复值的情况
- 栈要修改为存放一个动态数组,表示一些列取值相同的下标
- 这一个动态数组中的所有数,理应有相同的左最小和右最小
- 压栈循环
- 弹出比当前大的,填写操作与无重复相同,注意遍历数组
- 遇到与当前值相同的栈顶
- 不压栈而是加入到栈顶动态数组中
- 没有遇到与当前值相同的栈顶
- 新建动态数组压栈
- 出栈循环
- 与无重复相同,注意遍历数组