原文:85. 最大矩形(leetcode 解题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-085/

题目:

难度: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+Stackheights表示在当前行以上的整个状态,例如

[
  ["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
};

扩展阅读: