前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单调栈小结

单调栈小结

作者头像
attack
发布2018-05-30 14:13:03
5053
发布2018-05-30 14:13:03
举报

单调栈

单调栈是解决这样一类问题

给出$n$个数,问每一个数向左第一个比它小的数是谁

如果直接暴力的话,最坏情况下肯定是$O(n^2)$的,但是单调栈可以在$O(n)$的时间内解决这类问题

实现

单调栈,顾明思议嘛,就是维护一个具有单调性的栈,至于是单调递增还是单调递减,这个视题目而定

对于上面那个问题而言,我们需要维护一个单调上升的序列

加入一个元素的时候,若当前元素比栈顶元素小,那么就不断的弹出栈顶元素,直到整个栈满足单调

那么该位置向左第一个比它小的就是栈顶

上面说的太抽象了

比如,我们有一个序列$2,4,3,5,2$

设$ans[i]$表示第$i$个位置的答案

$2$加入序列,此时序列为$2$,$ans[1]=0$

$4$加入序列,此时序列为$2,4$,$ans[2]=2$

$3$加入序列,我们发现,如果将$3$直接加入序列,此时序列将不满足单调性,于是先删除$4$,再加入$3$,此时序列为$2,3$,$ans[3]=2$

$5$加入序列,此时序列为$2,3,5$,$ans[4]=5$

$2$加入序列,删除$2,3,5$,加入$2$,此时序列为$2$,$ans[5]=0$

考虑每一个元素最多被加入/删除一次,因此时间复杂度为$O(n)$

至于为什么,感觉挺显然的吧,就是利用单调性

例题

都是些水题

洛谷P2688

题解

HDU1506

题解

BZOJ1007

有些难度,用到了单调栈的思想

题解

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 单调栈
  • 实现
  • 例题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档