题目 <https://leetcode-cn.com/problems/largest-rectangle-in-histogram/>
单调栈
可以想象这样场景,在走廊里看一扇一扇的门,看到的永远是大门里有个小一点的门,小门里有更小一点的门......门的大小顺序不一样,只不过被挡住了。
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
int largestRectangleArea(int* heights, int heightsSize){
if(heightsSize==0){
return 0;
}
int **stack = malloc(sizeof(int*) * heightsSize);//单调栈,0为index,1为height
int stack_size=0;
int i,j;
for(i=0;i<heightsSize;i++){
stack[i] = malloc(sizeof(int) * 2);
}
int area = 0,area_tmp;
for(i=0;i<heightsSize;i++){
area = max(area,heights[i]);
for(j=stack_size-1;j>=0;j--){
area_tmp = min(heights[i],stack[j][1]);
area_tmp *= (i-stack[j][0]+1);
area = max(area,area_tmp);
}
for(j=stack_size-1;j>=0 && stack[j][1] >= heights[i];j--){}
if(j+1 == stack_size){//不会大于
stack[stack_size][0] = i;
stack[stack_size][1] = heights[i];
stack_size++;
}else{
stack[j+1][1] = heights[i];
stack_size = j+1+1;
}
//show(stack,stack_size);
}
for(i=0;i<heightsSize;i++){
free(stack[i]);
}
free(stack);
return area;
}