暴力循环 (c超时)
int largestRectangleArea(int* heights, int heightsSize){
int area = 0;
for (int i = 0; i < heightsSize; i++) {
int weight = 1;
int height = heights[i];
int j = i;
while ((--j >= 0) && (heights[j] >= height)) {
weight++;
}
j = i;
while ((++j < heightsSize) && (heights[j] >= height)) {
weight++;
}
if (area < (weight * height)) {
area = weight * height;
}
}
return area;
}
单调栈
int largestRectangleArea(int* heights, int heightsSize){
int area = 0;
int *htemp = NULL;
int sstack[heightsSize + 2];
int top = 0;
htemp = (int *)malloc((heightsSize + 2) * sizeof(int));
htemp[0] = htemp[heightsSize + 1] = 0;
for (int i = 0; i < heightsSize; i++) {
htemp[i + 1] = heights[i];
}
for (int i = 0; i < heightsSize + 2; i++) {
while ((top > 0) && (htemp[sstack[top - 1]] > htemp[i])) {
int height = htemp[sstack[top - 1]];
top--;
if (area < ((i - sstack[top - 1] - 1) * height)) {
area = (i - sstack[top - 1] - 1) * height;
}
}
sstack[top] = i;
top++;
}
return area;
}