小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
84. 柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
- 示例 1:
输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10
- 示例 2:
输入: heights = [2,4] 输出: 4
解题思路
维护一个单调递增的单调栈
- 我们需要遍历所有高度,然后在高度的左右两侧不断查找比当前高度大的点,因为只有这种高度的点,才能使得延申当前矩形
- 使用单调递增的栈,出栈的时候,我们可以找到左边第一个比当前高度小的,而单调栈出栈的时机又是当前遍历的高度比栈顶高度要小的,因此右边第一个比当前高度小的也可以确定下来了
代码
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;
}
}