85. 最大矩形

136 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

85. 最大矩形

给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

  • 示例 1:

在这里插入图片描述

输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]] 输出:6 解释:最大矩形如上图所示。

  • 示例 2:

输入:matrix = [] 输出:0

  • 示例 3:

输入:matrix = [["0"]] 输出:0

  • 示例 4:

输入:matrix = [["1"]] 输出:1

  • 示例 5:

输入:matrix = [["0","0"]] 输出:0

提示:

  • rows == matrix.length
  • cols == matrix[0].length
  • 0 <= row, cols <= 200
  • matrix[i][j] 为 '0' 或 '1'

解题思路

利用84. 柱状图中最大的矩形的代码,我们只需要将连续的1计算为高度,就和那题没什么区别了

代码

class Solution {
    public int maximalRectangle(char[][] matrix) {
        if(matrix.length==0) return 0;
        int[] h=new int[matrix[0].length];
        int res=0;
        for(int i=0;i<matrix.length;i++)
        {
            for(int j=0;j<matrix[0].length;j++)
            {
                if(matrix[i][j]=='0')
                {
                    h[j]=0;
                }else h[j]++;
              
            }
            res=Math.max(res,largestRectangleArea(h));
        }
        return res;
    }
    public int largestRectangleArea(int[] heights) {

        Stack<Integer> stack=new Stack<>();
        int n=heights.length;
        int[] nh=new int[n+2];
        for(int i=0;i<n;i++)
            nh[i+1]=heights[i];
        int res=0;
        for(int i=0;i<n+2;i++)
        {
            while(!stack.isEmpty()&&nh[i]<nh[stack.peek()]){
                int j=stack.pop(),h=nh[j];
                int w=i-stack.peek()-1;
                res=Math.max(res,h*w);
            }
            
            stack.push(i);
        }
        return res;
    }
}

时间复杂度:O(m^2n),其中 m 和 n 分别是矩阵的行数和列数。计算 left 矩阵需要 O(mn) 的时间。随后对于矩阵的每个点,需要 O(m) 的时间枚举高度。故总的时间复杂度为 O(mn) + O(mn) * O(m) = O(m^2n)

空间复杂度:O(mn),其中 m 和 n 分别是矩阵的行数和列数。我们分配了一个与给定矩阵等大的数组,用于存储每个元素的左边连续 1 的数量。