LeetCode--85.最大矩形(单调栈)

最大矩形(单调栈)

1. 题目描述

难度:困难
在这里插入图片描述

2. 题目分析

这道题目似曾相识啊,最大矩形面积的问题我们在LeetCode84.柱状图中最大的矩形也遇到过类似的问题,在84题中,我们应用了单调栈的方法,实现了O(n)的时间复杂度。在这一题中,我们可以将每一层都看做一个输入,比如第一层可以看做84题中的输入[1, 0, 1, 0, 0],这一层的最大矩形面积为1;第二层可以看做输入[2, 0, 2, 1, 1],该层的最大矩形面积为3; 第三层可以看做输入[3, 1, 3, 2, 2], 该层的最大矩形面积为6; 第四层可以做输入[4, 0, 0, 3, 0],该层的最大矩形面积为4。这样一来,85题就转化为了84题,我们只需要解决每一层对应的最大矩形面积,然后取所有层中的最大值即可。时间复杂度依然为O(n).

3. C语言实现

其中前两个函数copy了84题中的源码:

int returnMax(int a, int b){
    return a>b?a:b;
}
// 单调栈
int largestRectangleArea(int* heights, int heightsSize){
    if(heightsSize == 0) return 0;
    if(heightsSize == 1) return heights[0];
    int* stack = (int *)malloc(sizeof(int)*(heightsSize+1));
    int index = 0;
    int max = 0;
    int label;
    stack[index] = -1;
    for(int i = 0; i < heightsSize; i++){
        while(index != 0 && heights[i] < heights[stack[index]]){
            max = returnMax(max, heights[stack[index]]*(i-stack[--index]-1));
        }
        stack[++index] = i;
    }
    label = index;
    while(index != 0){
        max = returnMax(max, heights[stack[index]]*(stack[label]-stack[--index]));
    }
    return max;
}
int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize){
    if(matrixSize == 0) return 0;
    int* temp = (int *)malloc(sizeof(int)*matrixColSize[0]);
    int max = 0;
    for(int i = 0; i < matrixColSize[0]; i++){
        temp[i] = 0;
    }
    for(int i = 0; i < matrixSize; i++){
        for(int j = 0; j < matrixColSize[0]; j++){
            if(matrix[i][j] == '1') temp[j] += 1;
            else temp[j] = 0;
        }
        max = returnMax(max, largestRectangleArea(temp, matrixColSize[0]));
    }
    return max;
}

运行结果为:
在这里插入图片描述

发布了163 篇原创文章 · 获赞 188 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42580947/article/details/105116313