单调栈总结

单调递减栈中每个元素在弹栈时,其右侧是右边第一个大于自己的元素,左侧是左边第一个大于自己的元素,也就是数组所存在的低谷处。
在这里插入图片描述

1、接雨水

当数值低洼处会积累雨水,左侧第一个大于自己的数和右侧第一个大于自己的数对当前数值决定了该位置的雨水量。因此使用单调递减栈,弹栈时累加每个位置的雨水量即可。
![在这里插入图片描述](https://img-blog.csdnimg.cn/f0b4ef3b968547bcb231cda344b4b348.pn

class Solution {
   
public:
    
### 单调栈算法及其应用 单调栈是一种特殊的栈结构,其核心特点是栈内的元素保持单调递增或单调递减的顺序[^2]。这种数据结构在处理涉及比较相邻元素大小的问题时非常高效。以下将详细介绍单调栈的基本实现方法以及常见的应用场景。 #### 单调栈的基本实现 单调栈的实现通常基于普通栈,但需要满足单调性条件。具体来说,在向栈中插入新元素时,需要检查栈顶元素是否破坏了单调性。如果破坏,则需要弹出栈顶元素直到恢复单调性为止[^1]。 以下是单调递减栈的一个简单实现示例: ```python def build_monotonic_stack(arr): stack = [] result = [] for num in arr: # 弹出所有小于当前元素的栈顶元素 while stack and stack[-1] < num: stack.pop() # 将当前元素压入栈 stack.append(num) # 记录栈的状态(可选) result.append(stack.copy()) return result ``` #### 单调栈的应用场景 单调栈适用于解决一系列与“最近”相关的经典问题,例如: 1. **寻找最近的更大/更小元素** 单调栈可以用于快速找到某个元素左边或右边第一个比它大或小的元素。这类问题在股票价格波动、柱状图最大矩形面积等问题中十分常见。 2. **删除重复字母且字典序最小** 在字符串处理领域,单调栈可以帮助筛选出符合特定条件的字符组合。例如,通过单调栈可以实现删除重复字母后生成字典序最小的字符串[^3]。 3. **最大二叉** 单调栈可用于构造最大二叉,其中每个节点的值为其子节点的最大值。通过维护一个单调递减栈,可以快速确定每个节点的父节点关系[^3]。 4. **柱状图中的最大矩形面积** 给定一个由非负整数组成的高度数组,使用单调栈可以在 O(n) 时间复杂度内计算柱状图中的最大矩形面积[^4]。以下是一个具体的实现代码: ```python def largest_rectangle_area(heights): stack = [] max_area = 0 heights.append(0) # 添加哨兵,确保栈最终清空 for i, h in enumerate(heights): while stack and heights[stack[-1]] > h: height = heights[stack.pop()] width = i if not stack else i - stack[-1] - 1 max_area = max(max_area, height * width) stack.append(i) return max_area ``` #### 总结 单调栈是一种高效的算法工具,尤其适合处理涉及比较相邻元素大小的问题。通过合理利用单调栈的特性,可以显著降低时间复杂度并提高程序性能[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值