C++算法八股——单调栈(含代码)

 单调栈的作用是能够在一次遍历的情况下找到每个元素最左边或者最右边的第一个最大/小元素,得益于其独特的栈结构,我们可以通过手动维护一个非递增/递减的栈完成这个目的。

单调栈一共分为四种情况:

注意,这四种情况我们都可以从左向右遍历数组完成。有的时候为了方便计算边界情况的差值,可以压入dummy节点(例如美丽塔2),问最大我们压入INT_MAX。最小INT_MIN

1.找到每个元素左边的第一个最大元素

从左向右遍历数组,如果是901题这种要求即使计算,不会一次给出数组的,还需要用pair存好索引以及当前值。当新出现的元素大于栈顶元素的时候,令栈顶元素出栈,直到遇到比自己大的元素。注意这个是实时结算的,找到的结果是栈中之前存放的值

2.找到每个元素左边的第一个最小元素

同理,我们维护单调递增的栈即可

3.找到每个元素右边的第一个最大元素

从左向右遍历数组,遇到新元素大于栈顶元素,就出栈,直到栈中元素大于新元素。这个非实时结算,当后面遇到了满足条件的新元素,才更新栈中存放的之前的元素,也就是说为之前的元素找到了答案而非新遇到的元素

4.找到每个元素右边的第一个最小元素

同理,维护单调递增的栈即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值