给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出: 6
链接:https://leetcode-cn.com/problems/maximal-rectangle
思路:参照官方题解
int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize){
if(matrixSize == 0) return 0;
int m = matrixSize;
int n = *matrixColSize;
int *left = malloc(sizeof(int) * n);
int *right = malloc(sizeof(int) * n);
int *height = malloc(sizeof(int) * n);
int cur_left, cur_right;
int maxarea = 0;
int i, j;
for(i = 0; i < n; i++) {
left[i] = 0;
right[i] = n;
height[i] = 0;
}
for(i = 0; i < m; i++) {
cur_left = 0;
cur_right = n;
for(j = 0; j < n; j++) {
if(matrix[i][j] == '1')
height[j]++;
else
height[j] = 0;
}
for(j = 0; j < n; j++) {
if(matrix[i][j] == '1')
left[j] = left[j] > cur_left ? left[j] : cur_left;
else {
left[j] = 0;
cur_left = j + 1;
}
}
for(j = n-1; j >= 0; j--) {
if(matrix[i][j] == '1')
right[j] = right[j] < cur_right ? right[j] : cur_right;
else {
right[j] = n;
cur_right = j;
}
}
for(j = 0; j < n; j++) {
maxarea = maxarea > height[j] * (right[j] - left[j]) ? maxarea : height[j] * (right[j] - left[j]);
}
}
return maxarea;
}