题目描述:
给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例 1:
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:6
解释:最大矩形如上图所示。
题目解析:
本题与柱状图中最大的矩形几乎一致,求二维矩阵中矩形的最大面积,可以将每列作为一个柱形
就可以转化成求柱状图中的最大矩形。但是本题注意,遍历每行i,以i为底向上看1的个数,若第i行的某一列是0,则这列柱状高度就是0
//与柱状退最大矩形题一致
int largestRectangleArea(int* matrix, int matrixSize){
int* stack = (int*)malloc(sizeof(int)*(matrixSize+2));
memset(stack,0,sizeof(int)*(matrixSize+2));
int stack_i = 0;
int maxret = 0;
for(int i=0;i<=matrixSize;++i){
if(i==matrixSize){
while(stack_i>0){
int hight = matrix[stack[stack_i-1]];
int len=0;
if(stack_i>1)len = i-(stack[stack_i-2]+1);
else len = i;
maxret = fmax(maxret,hight*len);
stack_i--;
}
break;
}
if(stack_i==0||matrix[i]>=matrix[stack[stack_i-1]])stack[stack_i++] = i;
else if(matrix[i]<matrix[stack[stack_i-1]]){
while(stack_i>0&&matrix[i]<matrix[stack[stack_i-1]]){
int hight = matrix[stack[stack_i-1]];
int len=0;
if(stack_i>1)len = i-(stack[stack_i-2]+1);
else len = i;
maxret = fmax(maxret,hight*len);
stack_i--;
}
stack[stack_i++] = i;
}
}
return maxret;
}
int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize){
//建立哈希表,保存每行对应列的高度
int** HashTable = (int**)malloc(sizeof(int*)*matrixSize);
for(int i=0;i<matrixSize;i++){
HashTable[i] = (int*)malloc(sizeof(int)*(* matrixColSize));
bzero(HashTable[i],sizeof(int)*(* matrixColSize));
}
//保存每行的高度
for(int i=0;i<matrixSize;i++){
for(int j=0;j<*matrixColSize;++j){
if(i==0)HashTable[i][j] = matrix[i][j]-'0';
else {
if(matrix[i][j]=='0')HashTable[i][j] = 0;
else
HashTable[i][j] = HashTable[i-1][j] + matrix[i][j]-'0';
}
}
}
int ret = 0;
for(int i=0;i<matrixSize;++i){
int s = largestRectangleArea(HashTable[i],*matrixColSize);
ret = fmax(s,ret);
}
return ret;
}
执行用时:16 ms, 在所有 C 提交中击败了95.43%的用户
内存消耗:8.6 MB, 在所有 C 提交中击败了11.65%的用户