[leetcode 85. 最大矩形] 单调栈--84题的简单扩展

题目描述

给定一个仅包含 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”看作实心柱体,把“0”看作空心,跟84题就非常相似了。唯一不同的就是,我们这里还有一些悬空的柱子。不过没有关系,我们把它的高度记为0之后,并不会影响计算最大的面积。那么接下来就很思路清晰了:

  • 将矩阵的每一层单独拿出来,看作是一个84题的重复
  • 计算之前,我们先更新每一层的高度数组
  • 重复84题的计算

代码

/**
 * @param {character[][]} matrix
 * @return {number}
 */
var maximalRectangle = function(matrix) {
    let heights = [], max = 0;
    for (let i=0;i<matrix.length;i++) {
        if (heights.length == 0) {
            // init 
            // 前后补0,使代码更简洁
            for (let k=0;k<matrix[i].length+2;k++) {
                heights[k] = 0;
            }
        }
        let stack = [];
        for (let j=0;j<heights.length;j++) {
            // 同步更新每一个柱子的高度
            heights[j] = j>0&&j<=matrix[i].length&&'1'==matrix[i][j-1] ? heights[j]+1 : 0;
            // 计算每一个单调递增栈
            while (stack.length>0 && heights[j] < heights[stack[stack.length-1]]) {
                max = Math.max(max, heights[stack.pop()]*(j-stack[stack.length-1]-1));
            }
            stack.push(j);
        }
    }
    return max;
};
posted @ 2020-04-15 13:05  真理君的宿敌  阅读(266)  评论(0编辑  收藏  举报