给定一个由 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] 合并所有行 矩形组合 求出最大值 就是满足题意的
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"]));