原题
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。

以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]
。

图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10
个单位。
示例:
输入: [2,1,5,6,2,3] 输出: 10
解法
思想
这道题和leetcode42-接雨水较为相似。
对于每列来说,以当前列高为高的最大矩形区域的宽度区域为被左边最近较矮一列和右边最近较矮一列围起来的宽度。
如果两边有一边没有比当前列矮的一列,则左边算作-1,右边算作length。
代码
class Solution {
public int largestRectangleArea(int[] heights) {
int length = heights.length;
if(length==0) return 0;
int max = 0;
int left[] = new int[length];
int right[] = new int[length];
left[0] = -1;
right[length-1] = length;
for(int i = 1;i<length;i++){
//如果左边一列比当前列矮,则left就等于左边一列的下标。
if(heights[i]>heights[i-1]) left[i] = i-1;
else{
//否则沿着左边这列的left一直查找过去,直到找到比当前列低的一列
left[i] = left[i-1];
while(left[i]!=-1&&heights[left[i]]>=heights[i])
left[i] = left[left[i]];
}
}
for(int i = length-2;i>=0;i--){
//如果右边一列比当前列矮,则right就等于右边一列的下标。
if(heights[i]>heights[i+1]) right[i] = i+1;
else{
//否则沿着右边这列的right一直查找过去,直到找到比当前列低的一列
right[i] = right[i+1];
while(right[i]!=length&&heights[right[i]]>=heights[i])
right[i] = right[right[i]];
}
}
for(int i = 0;i<length;i++){
int area = (right[i]-left[i]-1)*heights[i];
if(area>max) max = area;
}
return max;
}
}
原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode84-%e6%9f%b1%e7%8a%b6%e5%9b%be%e4%b8%ad%e6%9c%80%e5%a4%a7%e7%9a%84%e7%9f%a9%e5%bd%a2/