84. 柱状图中最大的矩形

84. 柱状图中最大的矩形


本题使用栈。

为了理解栈的方法,先讲一下暴力法怎么求解:
依次遍历每个柱形的高度,计算完整包含这个柱形的矩形的最大面积:对于当前遍历到的柱形,向两边扩散。向左边扩散,看最多能向左延伸多长,找到第一个小于当前柱形高度的柱形的下标。向右边扩散,看最多能向右延伸多长,找到第一个小于当前柱形高度的柱形的下标。这两个下表的间隔乘上当前柱形的高度就是“完整包含这个柱形的矩形的最大面积”。

栈的方法就是用时间换空间,在遍历的时候记录下标的信息:




以此类推。

代码如下:

class Solution:
  def largestRectangleArea(self, heights) -> int:
    # 加个零有两个作用
    # 1.方便计算包含最后一个height的矩形的最大面积
    # 2.栈stack的最底层元素为-1,对应到height[-1]的元素为我们设置的0。这就相当于在原始heights两边加了两个0,作为边界
    heights.append(0)

    ans = 0
    stack = [-1]
    i = 0
    while i=heights[stack[-1]]:
        stack.append(i)
        i += 1
      else:
        ans = max(ans,heights[stack[-1]]*(i-stack[-2]-1))
        stack.pop()
    return ans

关键词:栈,空间换时间

你可能感兴趣的:(84. 柱状图中最大的矩形)