84. 柱状图中最大的矩形

133 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

84. 柱状图中最大的矩形

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

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

  • 示例 1: 在这里插入图片描述

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

  • 示例 2: 在这里插入图片描述

输入: heights = [2,4] 输出: 4

解题思路

维护一个单调递增的单调栈

  1. 我们需要遍历所有高度,然后在高度的左右两侧不断查找比当前高度大的点,因为只有这种高度的点,才能使得延申当前矩形
  2. 使用单调递增的栈,出栈的时候,我们可以找到左边第一个比当前高度小的,而单调栈出栈的时机又是当前遍历的高度比栈顶高度要小的,因此右边第一个比当前高度小的也可以确定下来了

代码


class Solution {
    public int largestRectangleArea(int[] heights) {

        Stack<Integer> stack=new Stack<>();
        int n=heights.length;
        int[] nh=new int[n+2];
        for(int i=0;i<n;i++)
            nh[i+1]=heights[i];
        int res=0;
        for(int i=0;i<n+2;i++)
        {
            while(!stack.isEmpty()&&nh[i]<nh[stack.peek()]){
                int j=stack.pop(),h=nh[j];
                int w=i-stack.peek()-1;
                res=Math.max(res,h*w);
            }
            
            stack.push(i);
        }
        return res;
    }
}