描述
给定一个数组heights,长度为n,height[i]是在第i点的高度,那么height[i]表示的直方图,能够形成的最大矩形是多少?
1.每个直方图宽度都为1
2.直方图都是相邻的
3.如果不能形成矩形,返回0即可
4.保证返回的结果不会超过231-1
数据范围:
0 <= heights[i] <= 10^40<=heights[i]<=104
0 <= heights.length <=10^50<=heights.length<=105
如输入[3,4,7,8,1,2],那么如下:
示例1
输入:
[3,4,7,8,1,2]
复制返回值:
14
复制
示例2
输入:
[1,7,3,2,4,5,8,2,7]
复制返回值:
16
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param heights int整型一维数组
* @return int整型
*/
public int countArea(int[] heights, int N, int i) {
int le = i, ri = i;
while(le > -1 && heights[le] >= heights[i]) le--;
while(ri < N && heights[ri] >= heights[i]) ri++;
return (ri - le - 1) * heights[i];
}
public int largestRectangleArea (int[] heights) {
// write code here
if(heights == null) {
return 0;
}
int N = heights.length;
if(N == 0) {
return 0;
} else if(N == 1) {
return heights[0];
}
int maxArea = 0;
for(int i = 0; i < N; i++) {
int area = countArea(heights, N, i);
if(area > maxArea) {
maxArea = area;
}
}
return maxArea;
}
}
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param heights int整型一维数组
* @return int整型
*/
public int countArea(int[] heights, int N, int i) {
int le = i, ri = i;
while(le > -1 && heights[le] >= heights[i]) le--;
while(ri < N && heights[ri] >= heights[i]) ri++;
return (ri - le - 1) * heights[i];
}
public int largestRectangleArea (int[] heights) {
// write code here
if(heights == null) {
return 0;
}
int N = heights.length;
if(N == 0) {
return 0;
} else if(N == 1) {
return heights[0];
}
int pre = heights[0];
int maxArea = countArea(heights, N, 0);
for(int i = 1; i < N; i++) {
if(heights[i] == pre) {
continue;
}
pre = heights[i];
int area = countArea(heights, N, i);
if(area > maxArea) {
maxArea = area;
}
}
return maxArea;
}
}