每日一题——最大矩形

    技术2022-07-12  101

    菜鸡每日一题系列打卡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)。

    执行结果

    学习 | 工作 | 分享

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

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

    Processed: 0.010, SQL: 9