84. 柱状图中最大的矩形 Largest Rectangle in Histogram

题目 <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;

}

猜你喜欢

转载自blog.csdn.net/ZRXSLYG/article/details/111916096