力扣84. 柱状图中最大的矩形

84. 柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例 1:

复制代码
输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

示例 2:

复制代码
输入: heights = [2,4]
输出: 4

提示:

  • 1 <= heights.length <=105
  • 0 <= heights[i] <= 104

如果有不了解单调栈这个数据结构的同学,可以在B站上看几分钟的视频了解一下!

单调栈思想:

  1. 核心逻辑就是通过维护一个单调递增栈,在 O(n)的时间内高效找到每个柱子的左右边界。
  2. 单调栈的核心特性在于:当一个元素被弹出时,它的左右边界会同时被确定。
    1. 右边界的确定 :当我们遍历到第 i 个柱子时,如果发现它的高度小于 栈顶柱子的高度,说明栈顶柱子遇到了右边第一个比它矮的柱子。因此,第 i 个柱子的索引就是栈顶柱子的右边界
    2. 左边界的确定 :由于栈内元素是单调递增的,当栈顶柱子弹出后,新的栈顶柱子 就是它左边第一个比它矮的柱子。因此,新的栈顶索引就是它的左边界

最下面是我写的代码,我来讲解一下代码的思路:

  • 初始化一个空栈,用于存柱子的索引。

  • 从左到右遍历柱子数组:

    • 若当前柱子高度大于或等于栈顶柱子高度,直接将当前索进入栈(保持单调递增特性)。

    • 若当前柱子高度小于栈顶柱子高度,说明找到了栈顶元素的右边界。开始循环弹出栈顶元素并计算面积:

      • 弹出当前栈顶,记为 cur(这是要计算面积的柱子)。

      • 当前遍历到的索引 i 即为 cur 的右边界。

      • 弹出后新的栈顶索引即为 cur 的左边界。

      • 计算面积并更新最大值:area = heightcur × (i - stack_top - 1)。

    • 重复弹出过程,直到当前柱子高度不再小于栈顶高度,然后将当前索引入栈。

Go 复制代码
func largestRectangleArea(heights []int) int {
	ans := 0
	n := len(heights)
	
	// 创建新数组,前后各加一个 0 作为哨兵,避免栈空判断
	h := make([]int, n+2)
	copy(h[1:], heights)
	
	// st 存的是索引,把左哨兵的索引 0 放入栈中
	st := []int{0}
	
	for i := 1; i < len(h); i++ {
		// 当前高度小于栈顶高度时,说明找到了栈顶柱子的右边界
		for h[i] < h[st[len(st)-1]] {
			// 弹出栈顶作为当前要计算面积的柱子
			cur := st[len(st)-1]
			st = st[:len(st)-1]
			
			// 此时新的栈顶就是 cur 的左边界
			w := i - st[len(st)-1] - 1
			area := h[cur] * w
			
			if area > ans {
				ans = area
			}
		}
		// 当前索引入栈,保持栈内索引对应的高度单调递增
		st = append(st, i)
	}
	
	return ans
}
相关推荐
c238561 小时前
《枚举算法 “翻译官”:用 enum class 给 “游游的礼盒” 算分》
c语言·c++·算法
小杍随笔1 小时前
2025年Rust GUI框架实战万字避坑指南
开发语言·后端·rust
noipp1 小时前
推荐题目:洛谷 P5843 [SCOI2012] Blinker 的噩梦
c语言·数据结构·c++·算法·游戏·洛谷·luogu
极客BIM工作室1 小时前
OpenCascade 倒角(Chamfer)算法完整逻辑解析
算法
geovindu1 小时前
CSharp: LogHelper
开发语言·后端·c#·.net
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-20 打印九九口诀表(C语言实现)
c语言·开发语言·数据结构·算法
鱼子星_2 小时前
《算 · 法》题目解析篇(1):最近公共祖先问题,线段树,最长回文子序列
c++·算法·动态规划·递归
雾喔2 小时前
算法练习5
算法·代理模式
捧 花2 小时前
从同步生成到异步任务:YoudaoNoteLM 的生成队列模块设计
go·agent·worker·eino
问商十三载2 小时前
RAG 检索召回越多越好?2026 信噪比模型深度解析
人工智能·算法·机器学习