单调栈模板总结及应用
文章和代码已经归档至【Github 仓库:https://github.com/timerring/algorithms-notes 】或者公众号【AIShareLab】回复 算法笔记 也可获取。
单调栈模板
栈:先进后出。
队列:先进先出。
数组模拟栈和队列相较于 STL 的好处在于速度快,虽然在实际编译的时候会有 O2 优化,使两者相差无几,但是在算法题中一般没有优化。
栈算法模板
复制代码
单调栈常用与给定一个数,寻找在这个序列中每一个数的左边离他最近的且比他小的数在什么地方。
例题:单调栈
给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。
输入格式
第一行包含整数 N,表示数列长度。
第二行包含 N 个整数,表示整数数列。
输出格式
共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。
数据范围
数列中元素
输入样例:
复制代码
输出样例:
复制代码
基本思路
定义一个栈,分别读入数据,然后判断栈中的数字,如果栈顶的数字大于等于读入的 x,则将该数出栈(把大于它的所有数剔除),直到栈顶数字小于该数,输出该数,然后将 x 存入栈顶。这样可以保证栈内的数字始终是一个线性的存储。即输入的 x 可以找到离它最近的比他小的数。
code
复制代码
虽然这个算法中有两个循环,但是实际针对第二层循环,每个数只会有压入和弹出两个操作,并没有涉及到遍历,因此时间消耗为 2N,时间复杂度为 O(N)。
同样也可以使用 STL 实现:
复制代码
版权声明: 本文为 InfoQ 作者【timerring】的原创文章。
原文链接:【http://xie.infoq.cn/article/a2e6d16e398ffcd6dbac58c37】。未经作者许可,禁止转载。
评论