剑指 Offer II 040. 矩阵中最大的矩形

155 阅读1分钟

剑指 Offer II 040. 矩阵中最大的矩形

给定一个由 0 和 1 组成的矩阵 matrix ,找出只包含 1 的最大矩形,并返回其面积。

注意:此题 matrix 输入格式为一维 01 字符串数组。

思路基于剑指 Offer II 039题的函数largestRectangleArea

  • 将本题给出的二维数组,看成若干个矩形组序列
  • 如下图所示,已知arr = ["10100","10111","11111","10010"]
  • 可以看成 [1,0,1,0,0]
  • [2,0,2,1,1] 第二行 加到 第一行中
  • [3,1,3,2,2] 合并前三行
  • [4,0,3,3,2] 合并所有行 矩形组合 求出最大值 就是满足题意的

image.png

var largestRectangleArea = function (arr) {
  arr = arr.concat(0);
  var brr = [-1];
  var res = 0;
  var f = (brr) => brr[brr.length - 1];
  for (var i = 0; i < arr.length; i++) {
    while (f(brr) != -1 && arr[f(brr)] >= arr[i]) {
      var h = arr[brr.pop()];
      var w = i - f(brr) - 1;
      res = Math.max(res, h * w);
    }
    brr.push(i);
  }
  return res;
};

var maximalRectangle = function (arr) {
  if (arr.length == 0 || arr[0].length == 0) {
    return 0;
  }
  var brr = new Array(arr[0].length).fill(0);
  var res = 0;
  for (var item of arr) {
    for (var i = 0; i < item.length; i++) {
      if (item[i] == "0") {
        brr[i] = 0;
      } else {
        brr[i]++;
      }
    }
    res = Math.max(res, largestRectangleArea(brr));
  }
  return res;
};

调试

console.log(maximalRectangle(["10100", "10111", "11111", "10010"]));