给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
思路一:单调栈
cpp
int largestRectangleArea(int* heights, int heightsSize){
int top = -1;
int area, i;
int maxarea = 0;
int *stack = (int *)malloc(sizeof(int) * (heightsSize + 2));
int *buff = (int *)malloc(sizeof(int) * (heightsSize + 2));
buff[0] = 0;
for (int i = 1; i <= heightsSize; i++) {
buff[i] = heights[i - 1];
}
buff[heightsSize + 1] = 0;
stack[++top] = 0;
for (i = 1; i < heightsSize + 2; i++) {
while (top > 0 && buff[i] < buff[stack[top]]) {
area = (i - stack[top - 1] - 1) * buff[stack[top]];
maxarea = maxarea > area ? maxarea : area;
top--;
}
stack[++top] = i;
}
return maxarea;
}
分析:
本题利用单调栈的特性,有两种做法,一是直接从中间数向左右进行递归,判断是否单调递增或递减计算答案,第二种是多加一个空间,从最左边或最右边判断是否为单调递增或递减,此做法多设置了一个空间,利用单调栈向左单调递减的特性找最小值计算矩形的最大值,最后输出答案。
总结:
本题考察单调栈相关知识,利用单调递减递归找到最小值计算矩形大小,最后返回最大值