算法系列25——单调栈

单调栈用于找到最近的较小元素,栈中存储下标。对于无重复元素的数组,遍历并压栈,弹出比当前值大的栈顶元素,记录左右边界。有重复值时,栈存储相同值的下标数组,处理方式类似,遇到相同值时不压栈而添加到栈顶数组。最终生成二维数组表示每个元素的左右最近较小元素的下标。
摘要由CSDN通过智能技术生成

单调栈有两种类型

  • 允许重复数字
  • 不允许重复数字

他的功能可以描述为getNearLess,找到最近的比他小的位置

单调栈中只存下标,辅助来找到NearLess,具体来说如果栈顶下标代表的值一直大于当前值就一直弹出直到栈变为空

单调栈的处理结果是一个二维数组,每个小数组是一个pair代表左边右边NearLess的下标,不存在则为-1

处理流程:

  • 原数组无重复元素
    • 遍历整个数组,依次进行压栈操作
      • 弹出栈顶比当前值大的,这些位置的右边界确定了
        • 弹出的过程中,每弹出一个栈顶,填一个nearLess
        • 左边界是剩下中的栈顶,如果栈空了,左边界-1
        • 右边界就是现在要压栈的值
      • 当前值压栈
    • 所有值都进行过压栈操作后,依此弹出栈中剩余的值
      • 左边界是剩下中的栈顶,如果栈空了,左边界-1
      • 他们的右边界都是-1,他们右边没有比他们小的数
  • 原数组有重复值的情况
    • 栈要修改为存放一个动态数组,表示一些列取值相同的下标
    • 这一个动态数组中的所有数,理应有相同的左最小和右最小
    • 压栈循环
      • 弹出比当前大的,填写操作与无重复相同,注意遍历数组
      • 遇到与当前值相同的栈顶
        • 不压栈而是加入到栈顶动态数组中
      • 没有遇到与当前值相同的栈顶
        • 新建动态数组压栈
    • 出栈循环
      • 与无重复相同,注意遍历数组
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值