【leetcode】84. 柱状图中最大的矩形

原题地址:https://leetcode.cn/problems/largest-rectangle-in-histogram/

单调栈题目。保证栈中元素单调递增。

这个题实际上就是对于每个点找到左右第一个小于它高度的位置,就可求出以它为高的最大方块。

遍历,

遇到比栈顶元素代表高度小的位置,就不断出栈,直到heights[i] >= heights[s.top()],再把当前位置入栈;

遇到比栈顶元素代表高度大的位置,直接入栈

这样可以保证栈的单调性。

 

 

出栈的时候可以计算出栈的那个元素对应的最大方块。

当一个元素出栈时,右边界就是当前遍历位置,因为只有heights[i] < heights[s.top()]才会出栈。如果在它们之间有更小元素的话,那这个元素早已出栈,所以当前遍历位置就是出栈的元素的右边界

左边界就是当前元素出栈后的栈顶元素,这根据上面构造栈的方法可以得知。

这样高度和左右边界都知道了。就可以求出对应的最大方块。

'''
单调栈
'''

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        s = [-1]
        heights.append(0)
        n = len(heights)
        ret = 0
        for i in range(n):
            cur = heights[i]
            while len(s) != 0 and heights[s[-1]] > cur:
                height = heights[s[-1]]
                s.pop()
                left = s[-1] if len(s) != 0 else 0
                right = i
                ret = max(ret, height * (right - left - 1))
            s.append(i)
        return ret

  

posted @ 2022-09-06 17:30  gogslow  阅读(21)  评论(0)    收藏  举报