单调栈——求区间最小数乘区间和的最大值(单调增)

这篇博客介绍了如何利用单调栈解决数组中寻找区间最小数乘区间和最大值的问题。通过设置哨兵元素简化边界条件,避免非空判断,并在遇到更小元素时计算区间和,从而找到最大值。类似问题如接雨水和求最大矩形面积也可用此方法。代码示例展示了如何实现这一算法。

思路:

计算目标:计算以不同数作为区间最小数时,对应最大区间的(区间和*最小数)的值(因为最小数是固定的,最后要求的结果一定属于最小数*最大区间之和,因此找最大区间即可)。

数组元素依次入栈,当当前元素小于栈顶时,可以对栈顶元素作为最小数的情况进行计算(因为此时栈顶元素>其栈内前面的元素,且栈顶元素>当前元素,即栈顶元素作为最小数的区间范围可以确定:栈顶元素对应的下标~当前元素之前),对栈顶元素计算完之后,将其弹出,然后继续对栈顶元素进行判断。直到栈空。


类似的题目有:

接雨水:(单调递减栈):就是当遇到比栈顶元素大的元素时,将栈顶弹出,这时可以计算当前元素和新的栈顶之间的雨水,继续判断当前元素是否比栈顶元素小,如果是的话就弹出,如果栈空,则只把当前元素入栈,否则继续计算当前元素和新的栈顶之间的雨水)、

求最大矩形面积(单调递增栈):计算目标是“计算以不同列作为矩形高度的最大矩形的面积,即求以不同列作为最小数的区间范围”,因此当遇到比栈顶小的元素时,可以计算该范围(因为栈内单调增,可以保证前面的元素小于栈顶元素(且前面挨着的元素为栈顶元素在数组中向左的第一个比他小的元素,即中间的元素都比他大,因为他一定会将之前比他大的元素弹出栈,因此它在这个范围内为最小值),即可以确定区间左边界,当前元素是栈顶元素右边的第一个小于栈顶元素的元素否则栈顶不会在栈内),即栈顶元素到当前元素之间的元素都比栈顶大,可以确定区间右边界)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值