给定 n 个非负整数表示直方图条形高度,其中每个条形的宽度为1,找到直方图中最大矩形的区域。
例如,给定高度= [2,1,5,6,2,3],返回10。
解题思路:
- 寻找数组的局部峰值(如果一个元素的后面一个元素小于该元素,那么该元素就是它之前元素的局部峰值)
- 计算局部峰值所在区域的面积,并进行比较和记录
- 以该题为例:首先 2 是它之前元素的峰值,所以该局域的面积为 2,然后在 1,5,6 中 6 是局部峰值,计算该区域的面积,其中 10 为最大值,最后是 2,3,其中 3 是最大值,面积为 4。最后 该题的结果是 10
代码如下:
public int largestRectangleArea(int[] height) {
if(height == null || height.length == 0) return 0;
// 记录当前最大的面积
int res = 0;
int length = height.length;
for(int i = 0; i < length; i++){
// 寻找局部峰值
if(i + 1 < length && height[i] < height[i + 1])
continue;
//在该局部峰值内寻找面积最大值
int minH = height[i];
for(int j = i; j >= 0; j--){
minH = Math.min(minH,height[j]);
int area = minH * (i - j + 1);
res = Math.max(area,res);
}
}
return res;
}