Leetcode 84. 柱状图中最大的矩形

原题链接:. - 力扣(LeetCode)

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

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

示例 1:

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

示例 2:

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

提示:

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

思路:

本题可采用单调栈的解法。单调递增栈可以认为是从栈头到栈尾单调递增,单调递减栈可以认为从栈尾到栈头单调递减。

本题可以采用单调递减栈解决。

大体思路:对于每一个柱子,我们需要找到这根柱子左边 向左第一根柱子高度小于当前柱子高度的柱子的下标,和右边向右第一根柱子高度小于当前柱子高度的柱子下标,如下图,然后计算由当前柱子为基础所能形成的柱子的最大面积。

在具体实现的时候,栈中的元素为下标值。遍历每一根柱子,当遇到柱子高度小于栈顶元素所对应的柱子高度时,就开始进行计算。得到每一根柱子的最大面积,res 为这些面积中的最大值。

在通过 for(int i )遍历柱子时,分为三种情况:

一、当当前柱子的 i 高度大于栈顶元素所对应的柱子高度时,就可以将当前柱子的下标 i 入栈;

二、当当前柱子 i 的高度等于栈顶元素所对应的柱子的高度时,可以将当前柱子的下标 i 直接入栈,也可以先将当前栈顶元素弹出,再入栈,两者的区别在于前者在第三种情况计算时会多计算一次(会多进行一次面积计算结果为0的计算),但最后的结果 res 不变(因为 res 是所有面积中的最大值)。

三、当前柱子 i 的高度小于栈顶元素对应的柱子高度,这时可以进行计算(一直计算,直到 i 所对应的高度不大于栈顶元素)。此时 i 为上文中的右边界 right,栈顶元素 mid 为选中的要进行计算的那根柱子的下标,将 mid 弹出后,此时的栈顶元素是上文中的左边界 left。因此 height = heightsmid,width = right - left - 1。面积为 height * mid。 res = Math.max(res, height * mid );

这道题目强烈建议手动执行一下代码过程,会有更清晰的理解。

代码:

java 复制代码
class Solution {
    public int largestRectangleArea(int[] heights) {
        int[] newHeights = new int[heights.length+2];
        for(int i=0;i<heights.length;i++){
            newHeights[i+1]=heights[i];
        }
        //在heights的头尾加上零,使可以正确的进行计算
        heights = newHeights;
        Deque<Integer> stk = new ArrayDeque<>();
        stk.push(0);
        int res = 0;
        for(int i=1;i<heights.length;i++){
            if(heights[i]>heights[stk.peek()]){
                stk.push(i);
            }
            else if(heights[i]==heights[stk.peek()]){
                stk.pop();//不执行这一步也可以,只是在后面会多执行一次计算,不影响结果。
                stk.push(i);
            }
            else{
                while(!stk.isEmpty()&&heights[i]<heights[stk.peek()]){
                    int mid = stk.peek();
                    stk.pop();
                    int left = stk.peek();
                    int right = i;
                    int width = right - left - 1;
                    int height = heights[mid];
                    res = Math.max(res,width*height);
                }
                stk.push(i);
            }
        }
        return res;
    }
}

参考:单调栈,又一次经典来袭! LeetCode:84.柱状图中最大的矩形_哔哩哔哩_bilibili

相关推荐
2601_967760787 分钟前
2026年PDF压缩与页码添加工具技术实测:性能、算法与本地化适配深度对比
算法·pdf
不会就选b1 小时前
算法日常・每日刷题--<贪心>7
数据结构·算法·leetcode
moonrailgun1 小时前
用 Node.js 复刻 Codex Astra 的终端星光
前端·javascript·算法
罗西的思考2 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(1)--- 总体
人工智能·算法·机器学习
lvwangshu3 小时前
图论:LCA、树的直径、树的重心、二分图与 Tarjan 缩点
算法·图论
后台模板学习3 小时前
2026最新面试真题:到达用英语怎么说背后的逻辑与源码剖析
面试·职场和发展·php
CoderYanger3 小时前
前端基础——JavaScript(WebAPI)(下篇)
java·开发语言·前端·javascript·程序人生·面试·职场和发展
302wanger3 小时前
干与湿:AI 拿走脑力之后,人剩下什么
算法
计算机编程-吉哥4 小时前
脑肿瘤MRI智能识别系统:基于深度学习的像素级脑肿瘤语义分割平台【计算机毕业设计选题推荐】
人工智能·python·深度学习·算法·毕业设计·课程设计·大数据毕业设计选题推荐
用户204937554955 小时前
端侧语音部署踩坑:模型能跑不等于终端真的能用
后端·算法