题目描述
有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。
给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。
测试样例:
[2,7,9,4,1],5
返回:14
public int countArea(int[] A, int n) {
if (n == 1) {
return A[0];
}
int maxarea = 0;
int width = 0;
int top = -1;
int[] stack = new int[n];
for (int i = 0; i < n; i++) {
//如果栈空或者当前高度大于栈顶的矩形高度的时候就压入栈
if (top < 0 || A[i] > stack[top]) {
stack[++top] = A[i];
} else {
width = 0;
//小于栈顶的矩形高度就弹出栈,更新最大的矩形面积
while (top >= 0 && stack[top] > A[i]) {
++width;
int area = stack[top] * width;
maxarea = maxarea > area ? maxarea : area;
--top;
}
++width;
for (int j = 0; j < width; j++) {
stack[++top] = A[i];
}
}
}
width = 0;
//最后栈中只剩递增的序列
while (top >= 0) {
++width;
int area = stack[top] * width;
maxarea = maxarea > area ? maxarea : area;
--top;
}
return maxarea;
}
/**
* 最大矩形的高度必定是数组的某一项height[i]
* max{width*height[i]} (0 <= i < n)
* left(i)为以数组第i项为矩形高度时矩形左侧最大宽度,
* right(i)为以数组第i项为矩形高度时矩形右侧最大宽度,
* 则width = left(i) + right(i) - 1
*
* @param A
* @param n
* @return
*/
public int countarea(int[] A, int n) {
int maxarea = 0;
for (int i = 0; i < n; i++) {
int width = 1;
for (int j = i - 1; j >= 0; --j) {
if (A[j] >= A[i]) {
++width;
} else {
break;
}
}
for (int j = i + 1; j < n; ++j) {
if (A[j] >= A[i]) {
++width;
} else {
break;
}
}
int area = width * A[i];
maxarea = maxarea > area ? maxarea : area;
}
return maxarea;
}
972

被折叠的 条评论
为什么被折叠?



