LC 84栈与队列困难第 39 / 95 题

柱状图中最大的矩形

Largest Rectangle in Histogram

单调栈边界扩展
本机进度仅保存在当前浏览器

题目描述

给定 n 个非负整数表示柱状图中各柱子的高度,每根柱子宽度为 1,求在该柱状图中能够勾勒出来的矩形的最大面积。

示例:heights = [2, 1, 5, 6, 2, 3],最大矩形取高度 5、6 两柱,宽 2,面积 10。

解题思路

  1. 换个角度:枚举"以每根柱子为最矮柱"能向左右扩展多远,面积 = 高度 × 扩展宽度。
  2. 朴素扩展是 O(n^2);单调递增栈在"遇到更矮柱"时一次性确定栈顶柱的左右边界。
  3. 弹出栈顶时:右边界是当前下标 i,左边界是弹出后新栈顶(其右边第一个更矮柱),宽度为 i - new_top - 1。
  4. 末尾追加哨兵高度 0,保证所有柱子都被弹出结算;左右相等高度的情况不影响正确性。

参考实现

查看参考实现Python · 建议先自行作答
def largestRectangleArea(heights):
    # 哨兵:末尾高度 0 触发全部出栈结算
    stack = []
    best = 0
    for i, h in enumerate(heights + [0]):
        while stack and heights[stack[-1]] >= h:
            height = heights[stack.pop()]
            left = stack[-1] if stack else -1
            best = max(best, height * (i - left - 1))
        stack.append(i)
    return best

复杂度与归属

时间复杂度O(n)
空间复杂度O(n)
所属分类栈与队列
题源LeetCode 84

关联教程

返回题图鉴