LeetCode|85. 最大矩形

245 阅读1分钟
  • 题目描述

题目链接:leetcode-cn.com/problems/ma… image.png

  • 思路分析

这题可以看作对于矩阵的每一个位置,以他为右下角的最大全为'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;
};