单调栈与单调队列

单调栈

题意:

对于一个数组中每一个数来说,找到其左面第一个小于该点的值。

很容易想到是单调栈,可是为什么用单调栈呢?

证明:

我们对[a b] c {d0, d1, d2 ...}来说,已知a < b & b > c,对于c后面数字进行分析。
c后数字如果大于c,有可能答案是c,但答案不可能是b

那么对于c后的数字来说b是没必要存在的,可以由c来代替。

对于{}也就是待分析数字前,应该是单调递增的, 且可支持单侧(挨着{}的方向)动态更新递增数组,即把bc代替。

抽象完模型后为单调栈。


单调队列

题意:

更新滑动区间的最值,即[]为一个数组,内部有n个数字,求[1 ~ k], [2 ~ k + 1], [3 ~ k + 2]...的最值。

这个题和上面的题类似,由于是更新区间的最值,首先想到的是队列,出一个值然后加入一个值。

可是感觉太麻烦了,对于区间内部来说找到最小值,和次小值。
和下一个区间相比出去的值和进入的值去更新最小值和次小值,如果出值等于最小值,则由次小值更新最小值,可是次小值由谁来更新呢,显然是行不通的。

还是回到队列,和上题一样的思路。我们来看更新最小值。
对于[a b] c {d0, d1, d2 ...}来说,已知a < b & b > c,对于包含b和c的区间进行分析。
有可能答案是c,但答案不可能是b
抽象完还是单调的,且为队列,是双向更新的。

最小值分析完了,最大值也就同理了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值