给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
[“1”,”0”,”1”,”0”,”0”],
[“1”,”0”,”1”,”1”,”1”],
[“1”,”1”,”1”,”1”,”1”],
[“1”,”0”,”0”,”1”,”0”]
]
输出: 6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximal-rectangle
思路:
利用
84.柱状图中最大的矩形——hard-单调栈
中提到的单调栈思路, ,对每一行的high求一个最大矩形即是答案。
复杂度分析:
时间复杂度O(nm) 对每一行运行 需要 n
(每行长度) 时间,运行了 m
次,共计 O(nm)。
空间复杂度O(n)
var maximalRectangle = function(matrix) {
if(!matrix||!matrix.length||!matrix[0].length) return 0;
let m=matrix.length;
let n=matrix[0].length;
let high = new Array(n).fill(0);
let maxArea=0;
let getMaxArea= (row)=>{
row= [-1,...row,-1]
let maxStack=[];
for(let i=0;i<row.length;i++){
while(row[i]<row[maxStack[maxStack.length-1]]){
let tmp=maxStack.pop()
maxArea=Math.max(maxArea,row[tmp]*(i-maxStack[maxStack.length-1]-1))
}
maxStack.push(i)
}
}
for(let i=0;i<m;i++){
for(let j=0;j<n;j++){
let tmp=Number(matrix[i][j])
if(i===0){
high[j]=tmp
}else{
high[j]=tmp?tmp+high[j]:tmp
}
}
getMaxArea(high)
}
return maxArea
};