
image.png

image.png
解法
class Solution {
public int maximalRectangle(char[][] matrix) {
int row = matrix.length;
if (row == 0) {
return 0;
}
int col = matrix[0].length;
// 统计每一个点左侧连续1的长度
int[][] left = new int[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (matrix[i][j] == '1') {
left[i][j] = j == 0 ? 1 : left[i][j - 1] + 1;
}
}
}
int maxArea = 0;
Stack<Integer> stack = new Stack<>();
for (int j = 0; j < col; j++) {
// 逐列转化为求矩阵最大面积的题
// 求出列中每个点每一个上面和下面第一个小于节点的位置
int[] up = new int[row];
for (int i = 0; i < row; i++) {
while (!stack.isEmpty() && left[stack.peek()][j] >= left[i][j]) {
stack.pop();
}
up[i] = stack.isEmpty() ? -1 : stack.peek();
stack.push(i);
}
stack.clear();
int[] down = new int[row];
for (int i = row - 1; i >= 0; i--) {
while (!stack.isEmpty() && left[stack.peek()][j] >= left[i][j]) {
stack.pop();
}
down[i] = stack.isEmpty() ? row : stack.peek();
stack.push(i);
}
stack.clear();
for (int i = 0; i < row; i++) {
int height = down[i] - up[i] - 1;
maxArea = Math.max(maxArea, height * left[i][j]);
}
}
return maxArea;
}
}
网友评论