每日一题——最大矩形

菜鸡每日一题系列打卡85

每天一道算法题目 

小伙伴们一起留言打卡

坚持就是胜利,我们一起努力!

题目描述(引自LeetCode)

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

示例:
输入:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
输出: 6

题目分析

这是一道典型的动态规划题目,在思考状态转移方程之前,首先需要明确,局部最大矩形可通过如下方式构建:

  • 不断向上方遍历,直到遇到“0”,以此找到矩形的最大高度。

  • 向左右两边扩展,直到无法容纳矩形最大高度。

最大矩形就是局部最大矩形中最大的一个。

要获得最大矩形,我们需要申请三个数组,分别维护矩形的高、矩形宽的左边界、矩形宽的右边界,然后根据矩形面积公式,求取当前矩形的面积,并适时更新结果。

代码实现

class Solution {


    public int maximalRectangle(char[][] matrix) {
        if(matrix == null || matrix.length == 0) return 0;
        int row = matrix.length;
        int column = matrix[0].length;


        int[] left = new int[column];
        int[] right = new int[column];
        int[] height = new int[column];
        Arrays.fill(right, column);


        int result = 0;
        for(char[] c : matrix) {
            int lTmp = 0, rTmp = column;
            for(int i = 0; i < column; i++) {
                if(c[i] == '1') {
                    height[i]++;
                    left[i] = Math.max(left[i], lTmp);
                } else {
                    height[i] = 0;
                    left[i] = 0;
                    lTmp = i + 1;
                }
            }
            for(int i = column - 1; i >= 0; i--) {
                if(c[i] == '1') right[i] = Math.min(right[i], rTmp);
                else {
                    right[i] = column;
                    rTmp = i;
                }
            }
            for(int i = 0; i < column; i++) {
                result = Math.max(result, (right[i] - left[i]) * height[i]);
            }
        }
        return result;
    }


}

代码分析

对代码进行分析,不妨设matrix的行数为m,列数为n,则根据迭代次数可得,时间复杂度为O(mn)。


而就空间而言,采用了额外的空间用于矩形左右边界和高度的记录,空间复杂度为O(n)。

执行结果

学习 | 工作 | 分享

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章