leetcode 84.柱状图中最大的矩形(largest rectangle in histogram)C语言
1.description
https://leetcode-cn.com/problems/largest-rectangle-in-histogram/description/
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
2.solution
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int largestRectangleArea(int* heights, int heightsSize){
if(heightsSize == 0) return 0;
if(heightsSize == 1) return heights[0];
// 如果输入是递增的话, 不会进入while, 结果会是0. 在heights后面加上一个0即可解决, 强迫栈内元素出栈
heights = (int*)realloc(heights, sizeof(int)*(heightsSize+1));
heights[heightsSize] = 0;
heightsSize++;
int res = 0;
int *stack = (int*)malloc(sizeof(int)*heightsSize);
int top = -1;
for(int i=0; i<heightsSize; ++i){
while(top!=-1 && heights[i]<heights[stack[top]]){
int h = heights[stack[top]];
top--;
int left = top==-1 ? -1 :stack[top]; // 以h为高的最大矩形左边界, 即left是h左边第一个比h小的(left宽度不计面积); 另外, top--后可能栈空
int right = i; // 以h为高的最大矩形右边界, 即right是h右边第一个比h小的(right宽度不计入面积)
res = MAX(res, (right-left-1)*h);
}
stack[++top] = i;
}
free(stack);
return res;
}