Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.
Example:
Input: [ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"] ] Output: 6
题目求2维数组的最大矩形。
leetcode 84. Largest Rectangle in Histogram 的升级版。这里借用84题代码实现。代码如下:
/*
@Auth PaladinDu
*/
typedef struct Node{
int index;
int height;
};
int max(int i1, int i2){
return i1 > i2 ? i1 : i2;
}
int largestRectangleArea(int* heights, int heightsSize, struct Node *stack){
if(heightsSize == 0){
return 0;
}
struct Node *stackP = stack;// 栈定指针,stack表示空栈
int stackLen = 0;
int maxRet = 0;
for(int i= 0;i < heightsSize;++i,++heights){
int height = *heights;
int nodeIndex = i;
while(stackP > stack&&height < stackP->height){
maxRet =max(maxRet, (i - stackP->index)*(stackP->height));
nodeIndex = stackP->index;//如果有出栈index使用上一次出栈的位置
--stackP;
}
if(stackP == stack || height > stackP->height){//入栈
++stackP;
stackP->height = height;
stackP->index = nodeIndex;
}
}
//模拟插入一个0 闭合栈内的信息
while(stackP > stack){
maxRet =max(maxRet, (heightsSize - stackP->index)*(stackP->height));
--stackP;
}
return maxRet;
}
int maximalRectangle(char** matrix, int matrixRowSize, int* matrixColSizes) {
if(matrixRowSize == 0 ){
return 0;
}
int matrixColSize = matrixColSizes[0];
struct Node stack[matrixColSize+1]; //把stack放在外面,复用
int* heights = (int*) malloc(sizeof(int)*matrixColSize);
int maxRet = 0;
for(int j = 0 ;j < matrixColSize;++j){
int i;
for(i = 0;i < matrixRowSize; ++i){
if(matrix[i][j] == '0'){
break;
}
}
heights[j] = i;
}
maxRet = largestRectangleArea(heights,matrixColSize,stack);
int row = 0;
while(row <= matrixRowSize){
int minH = heights[0];
int minPos = 0;
for(int i = 1 ;i < matrixColSize;++i){
if(heights[i] < minH){
minPos = i;
minH = heights[i];
}
}
for(int i = 0;i < matrixColSize;++i){
if(heights[i] != minH){
heights[i] = heights[i] - minH - 1 ;
}else{
int h = 0;
for(int j = row + minH +1; j < matrixRowSize;++j,++h){
if(matrix[j][i] == '0'){
break;
}
}
heights[i] = h;
}
}
row = row + minH +1;
maxRet = max(maxRet,largestRectangleArea(heights,matrixColSize,stack));
}
return maxRet;
}