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;
}
运行结果为: