单调栈学习记录
单调栈是什么?
保证以下规则的数据结构称为单调栈,可以使用Stack或ArrayDeque等实现
栈中元素要么是严格递增的,要么是严格递减的。
每个元素入栈时,都会保持栈的单调性。
单调栈可以解决什么问题?
寻找一个数组中每个元素左边/右边第一个比它大/小的元素。
寻找一个数组中每个元素左边/右边第一个比它大/小的元素的索引。
计算一个数组中每个元素左边/右边第一个比它大/小的元素的值的差。
例如739.每日温度这种题,对于求当前元素左边或右边第一个比当前元素大或小的元素的位置,此类问题均可以采用单调栈的思路来做
单调栈的主要特点
可以在线性时间内解决上述问题,时间复杂度为O(n)。
通过维护栈的单调性,可以快速找到每个元素左/右边第一个满足条件的元素。
适用于处理需要考虑左/右邻近元素信息的问题。
基本实现思路
单调栈的基本实现可以分为以下几个步骤:
初始化一个空栈和一个结果数组。
遍历输入数组,对于每个元素:
当栈不为空且当前元素满足单调性条件时,不断弹出栈顶元素并记录结果。
将当前元素压入栈。
处理栈中剩余元素,给它们赋予默认值(通常为-1)。
返回最终的结果数组。
单调性条件condition(cur, top)
需要根据具体问题进行定义。例如,对于找左边第一个比当前元素大的,条件可以是cur > top
。
更简单的来说,单调栈的基本规则就是一句话(以单调递增栈为例):
就是如果要入栈的元素比栈顶元素大,更新此时栈顶元素下标对应的结果,然后弹出去,如果还比栈顶元素大,还一直弹,直到没有比他大的了,然后入栈
相关刷题文章
739. 每日温度
文章地址:leetcode-739. 每日温度
496. 下一个更大元素 I
503. 下一个更大元素 II
402. 移掉 K 位数字
文章地址:leetcode-402. 移掉K位数字
901. 股票价格跨度
文章地址:leetcode-901. 股票价格跨度
84. 柱状图中最大的矩形
42. 接雨水
239. 滑动窗口最大值
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 DoublePeach
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果