题目:
难度:Hard
相关话题:栈
、数组
、哈希表
、动态规划
给定一个仅包含0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出: 6
思路:
DP+Stack
,heights
表示在当前行以上的整个状态,例如
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
第一行,heights=[1,0,1,0,0]
,表示它内部有2个高度为1
的矩形;
第二行,heights=[2,0,2,1,1]
,表示第一列高度为2
,第二列高度为0
…;
第三行,heights=[3,1,3,2,2]
;
第四行,heights=[1,0,0,3,0]
,注意,因为第2
列、第3
列和第5
列在当前行都是0
,因此heights[i]=0
。
对于每一行的状态heights
,利用NO.84
的方法求出最大面积,最后筛选出最大面积。
/**
* @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
* @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
* @param {character[][]} matrix
* @return {number}
*/
var maximalRectangle = function(matrix) {
function getMaxArea(heights){
let stack=[-1],maxArea=0
for(let i=0;i<=heights.length;i++){
while(stack.length>1 && (i===heights.length || heights[i]<heights[stack[stack.length-1]])){
let lastId=stack.pop(),
lastH=heights[lastId],
width=i-stack[stack.length-1]-1
maxArea=Math.max(maxArea,width*lastH)
}
stack.push(i)
}
return maxArea
}
if(matrix.length===0)return 0
let maxArea=0
let dp=Array(matrix[0].length).fill(0)
for(let i=0;i<matrix.length;i++){
for(let j=0;j<matrix[i].length;j++){
if(matrix[i][j]==="0") dp[j]=0
else dp[j]+=1
}
let area=getMaxArea(dp)
maxArea=Math.max(maxArea,area)
}
return maxArea
};
扩展阅读: