[代码随想录]Day52-单调栈part03

题目:84. 柱状图中最大的矩形

思路:

实现要确定一个核心问题:包含完整一个柱子的最大矩形要找到这根柱子左侧最后一个高于他的柱子以及右侧最后一个高于他的柱子的位置(等同于左侧第一个小于他,右侧第一个小于他,因为+1 -1就是)

只要get到一个点,比如:30 50 70 80 60 70 40 这一段柱子,在遍历到40时,栈内元素是 30 50 60,当遇到40时,60这个数就同时拥有了左侧最小值的位置(即50的位置),以及右侧最小值的位置(即40的位置),那么在50到60 以及 60 - 40之间的柱子都是大于60的(70,80 | 70)。也就是说在60这个高度上能取到的宽度就是4( 70 80 60 70 ),也就是说40的位置(6) - 50的位置(1) - 1 = 宽度(4)。

代码:

func largestRectangleArea(heights []int) int {
 	max := 0
 	stack := make([]int, 0)
 	heights = append([]int{0}, heights...)
 	heights = append(heights, 0)
	stack = append(stack, 0)
	for i := 1; i < len(heights); i++ {
        for heights[stack[len(stack)-1]] > heights[i] {
               mid := stack[len(stack)-1]
               stack = stack[0 : len(stack)-1]
               left := stack[len(stack)-1]
               tmp := heights[mid] * (i - left - 1)
               if tmp > max {
                	max = tmp
               }
          }
          stack = append(stack, i)
     }
     return max
}

参考:

代码随想录

力扣题解

posted @   WtcSky  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示