题目:
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出: 6
解法一 暴力法优化
思路:
1、将数组转化为存放当前连续宽度;
2、基于84暴力法优化,只是将一维数据改为二维;
图片来源力扣官网
时间复杂度 O(n^2m)
空间复杂度 O(1)
var maximalRectangle = function (matrix){
if(!matrix.length) return 0;
let max = 0;
for(let i = 0, len = matrix.length; i < len; i++){
for(let j = 0, jlen = matrix[0].length; j < jlen; j++){
if(j === 0)
matrix[i][j] = parseInt(matrix[i][j]);
else
matrix[i][j] = matrix[i][j] === '1' ? matrix[i][j - 1] + 1 : 0;
let min = matrix[i][j];
for(let k = i; k >= 0; k--){
min = Math.min(min, matrix[k][j])
max = Math.max(max, (i - k + 1) * min);
}
}
}
return max
}
解法二 栈
思路:
1、基于84栈优化,只是将一维数据改为二维,并将矩阵转置;
时间复杂度 O(nm)
var maximalRectangle = function (matrix){
if(!matrix.length) return 0;
let max = 0;
let sumMatrix = getSumMatrix(matrix);
let triMatrix = getTriMatrix(sumMatrix);
for(let i = 0, len = triMatrix.length; i < len; i++){
max = Math.max(max, largestRectangleArea(triMatrix[i]))
}
return max
}
// 栈
var largestRectangleArea = function(heights) {
let i = 0;
let max = 0;
let stack = [];
heights.push(0);
heights.unshift(0);
while(i < heights.length){
while(stack.length && heights[i] < heights[stack[stack.length - 1]]){
max = Math.max(max, heights[stack.pop()] * (i - stack[stack.length - 1] - 1))
}
stack.push(i++);
}
return max;
};
var getSumMatrix = function(matrix) {
return matrix.map(item => {
let num = 0;
let arr = [];
item.forEach(i => {
if(i === '1'){
num += 1;
}else{
num = 0;
}
arr.push(num);
})
return arr;
});
}
var getTriMatrix = function(matrix) {
let result = [],
len = matrix.length,
childLen = matrix[0].length;
for(let i = 0; i < childLen; i++){
let arr = [];
for(let j = 0; j < len; j++){
arr.push(matrix[j][i])
}
result.push(arr);
}
return result;
}