-
题目描述
题目链接:leetcode-cn.com/problems/ma…
-
思路分析
这题可以看作对于矩阵的每一个位置,以他为右下角的最大全为'1'矩阵的面积,所有我们可以记录每一个点的左边有多少连续'1',这就是目标矩阵的最大宽度,然后再往上遍历,每次如果上面的点能娶到的最大宽度小于目前的最大宽度就替换,每次计算面积取最大值,最后可以得到每一个点的最大面积,取这些面积中的最大值就是结果。
-
代码
var maximalRectangle = function (matrix) {
let row = matrix.length;
let cow = matrix[0]?.length;
let maxArea = 0;
let dp = new Array(row).fill(0).map(() => new Array(cow).fill(0));
const calculateArea = (i, j) => {
let area = 0;
let cow = 1;
let row = dp[i][j];
while (cow <= i + 1) {
row = Math.min(row, dp[i - cow + 1][j]);
if (row == 0) {
return area;
}
area = Math.max(area, row * cow);
cow++;
}
return area;
}
for (let i = 0; i < row; i++) {
for (let j = 0; j < cow; j++) {
if (matrix[i][j] == '1') {
dp[i][j] = (j ? dp[i][j - 1] : 0) + 1;
maxArea = Math.max(maxArea, calculateArea(i, j));
}
}
}
return maxArea;
};