思路:
计算目标:计算以不同数作为区间最小数时,对应最大区间的(区间和*最小数)的值(因为最小数是固定的,最后要求的结果一定属于最小数*最大区间之和,因此找最大区间即可)。
数组元素依次入栈,当当前元素小于栈顶时,可以对栈顶元素作为最小数的情况进行计算(因为此时栈顶元素>其栈内前面的元素,且栈顶元素>当前元素,即栈顶元素作为最小数的区间范围可以确定:栈顶元素对应的下标~当前元素之前),对栈顶元素计算完之后,将其弹出,然后继续对栈顶元素进行判断。直到栈空。
类似的题目有:
接雨水:(单调递减栈):就是当遇到比栈顶元素大的元素时,将栈顶弹出,这时可以计算当前元素和新的栈顶之间的雨水,继续判断当前元素是否比栈顶元素小,如果是的话就弹出,如果栈空,则只把当前元素入栈,否则继续计算当前元素和新的栈顶之间的雨水)、
求最大矩形面积(单调递增栈):计算目标是“计算以不同列作为矩形高度的最大矩形的面积,即求以不同列作为最小数的区间范围”,因此当遇到比栈顶小的元素时,可以计算该范围(因为栈内单调增,可以保证前面的元素小于栈顶元素(且前面挨着的元素为栈顶元素在数组中向左的第一个比他小的元素,即中间的元素都比他大,因为他一定会将之前比他大的元素弹出栈,因此它在这个范围内为最小值),即可以确定区间左边界,当前元素是栈顶元素右边的第一个小于栈顶元素的元素(否则栈顶不会在栈内),即栈顶元素到当前元素之间的元素都比栈顶大,可以确定区间右边界)
单调栈——求区间最小数乘区间和的最大值(单调增)
最新推荐文章于 2025-03-09 21:49:24 发布
这篇博客介绍了如何利用单调栈解决数组中寻找区间最小数乘区间和最大值的问题。通过设置哨兵元素简化边界条件,避免非空判断,并在遇到更小元素时计算区间和,从而找到最大值。类似问题如接雨水和求最大矩形面积也可用此方法。代码示例展示了如何实现这一算法。

最低0.47元/天 解锁文章
10万+

被折叠的 条评论
为什么被折叠?



