← 返回编程题库
coding-largest-volume-rectangle-histogram中等免费版2000ms未尝试

直方图中的最大体积矩形

Largest Volume Rectangle in a Histogram

开始编码

给定一个直方图:heights[i] 是第 i 根单位宽度柱子的非负整数高度,所有柱子沿整数 x 轴依次排列。任务是经典的直方图中最大矩形问题(LeetCode 84):选一段连续范围 [l, r] 与一个统一高度 h,要求 h ≤ min(heights[l..r]),矩形覆盖 (r - l + 1) 列、高 h、面积 h * (r - l + 1)。返回所有合法 (l, r, h) 中的最大面积。

这个形状在做市与微结构里反复出现,等价于订单簿快照里的最大连续深度矩形:把 heights[i] 读作第 i 个相邻价位上的挂单量,答案就告诉你单笔可吃单的市价单在「同一统一深度」下能扫到的最大成交量。算法完全一致,只是换了一层叙事外壳。

请实现 solution(heights: list[int]) -> int示例。solution([2, 1, 5, 6, 2, 3]) 返回 10:最优矩形选择下标 [2, 3](高度 5、6),统一高度 h = 5,面积 5 * 2 = 10;只用 heights[3] = 6 单根柱子面积是 6,末尾 [4, 5] 一对面积是 4,都不及 10。solution([3, 3, 3, 3]) 返回 12:一整段平台合成一个矩形——这个用例正是 >= 弹栈条件会悄悄把答案砍到 3 的地方,应当作第一道回归测试跑过再相信代码。solution([]) 返回 0

朴素思路(对每对 (l, r) 计算区间最小值再乘宽度)是 O(n²) 或更糟,在 n = 10^5 时膨胀到 10^10 量级运算,根本跑不动。正确工具是单调栈。维护一个下标栈,使得对应的高度自底向上非递减。处理下标 i 时,弹出所有满足 heights[stack[-1]] > heights[i] 的栈顶 j:弹出的瞬间,以 heights[j] 为限高的最大矩形已经完全确定——右边界是 i(右侧第一个严格更矮),左边界是弹出后新栈顶(左侧第一个严格更矮,栈空时取 -1),宽度 right - left - 1。在序列末尾追加哨兵 0,循环自然把残留下标一起结算掉。每个下标至多入栈、出栈各一次:摊销 O(n) 时间、O(n) 最坏栈空间。

约束条件

  • 0 ≤ len(heights) ≤ 100000
  • 0 ≤ heights[i] ≤ 10^9,整数
  • 返回 `int`;空 `heights` 返回 0
  • 矩形面积 = `height * width`,其中 `width` 是共享同一统一高度的连续柱子数
  • 时间复杂度必须为摊销 O(n);O(n²) 双重循环在大测试上会超时

样例

Case 1 · empty histogram

输入: [[]]

期望: 0

空数组没有任何柱子,最大矩形面积是 0。这是一个边界情况。

Case 2 · single bar

输入: [[7]]

期望: 7

只有一根柱子,最大矩形就是这根柱子本身:高 7、宽 1,面积 7。

Case 3 · classic LeetCode 84

输入: [[2,1,5,6,2,3]]

期望: 10

在索引 [2, 3] 选取两根柱子(高度 5 和 6),用统一高度 h = 5,宽度 2,面积 5×2 = 10。这是教科书例子(LeetCode 84),其它候选都更小。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · empty histogram

输入: [[]]

期望: 0

空数组没有任何柱子,最大矩形面积是 0。这是一个边界情况。

Case 2 · single bar

输入: [[7]]

期望: 7

只有一根柱子,最大矩形就是这根柱子本身:高 7、宽 1,面积 7。

Case 3 · classic LeetCode 84

输入: [[2,1,5,6,2,3]]

期望: 10

在索引 [2, 3] 选取两根柱子(高度 5 和 6),用统一高度 h = 5,宽度 2,面积 5×2 = 10。这是教科书例子(LeetCode 84),其它候选都更小。