力扣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
}
相关推荐
3DVisionary1 小时前
蓝光三维扫描:医疗制造的精度焦虑怎么解
人工智能·算法·制造·蓝光三维扫描·医疗制造·三维检测·义齿检测
好评笔记1 小时前
机器学习面试八股——常用损失函数
人工智能·深度学习·算法·机器学习·校招
weixin_468466851 小时前
全局与局部注意力机制新手实战指南
人工智能·python·深度学习·算法·自然语言处理·transformer·注意力机制
sheeta19982 小时前
LeetCode 每日一题笔记 日期:2026.05.29 题目:3300. 最小元素
笔记·leetcode
_日拱一卒2 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
swipe2 小时前
Neo4j + Graph RAG 医疗知识图谱工程实践:患者教育问答真正需要的是“关系可追溯”
后端·langchain·llm
珂朵莉MM2 小时前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--束搜索
人工智能·算法
源码宝3 小时前
MES系统源码:Java8 + SpringBoot2.7 + MySQL8 + Redis,后端源码清爽易扩展
java·后端·源码·springboot·mes系统·源码二开·mes源码
Omics Pro3 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言