LeetCode | 85. 最大矩形

一、题目描述

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

示例1
在这里插入图片描述
在这里插入图片描述
示例2
在这里插入图片描述
示例3
在这里插入图片描述
示例4
在这里插入图片描述
示例5
在这里插入图片描述
提示
在这里插入图片描述

二、题解及思路

对于解答这道题,我们最开始想到的解法就是:列举所有的矩形(列举所有可能的矩形的左上角坐标和右下角坐标),然后获取得到最大面积的矩形。但是这种算法的时间复杂度太高,无法通过所有的测试用例。

这里提供两种解法,如果有更好的解法,欢迎大家留言~~

2.1、方法一: 柱状图中最大的矩形-优化版暴力算法复用

还记得上一期所讲的【柱状图中最大的矩形-优化版暴力算法】吗?这里不细说,可以参考阅读。

  • 要求:面积 = 长 宽
  • 思路:
  1. 首先先行进行遍历,获取并记录每行连续1的数量。如下图:
    在这里插入图片描述
  2. 计算矩形长度和宽度:对于矩阵中的每个点,按照列向上进行遍历,获取该遍历范围内的最小值,作为矩形的“长”,而遍历的行数就是矩形的“宽”。如下图:
    在这里插入图片描述
    因此,area = width * (i-k+1) 。width即为按列遍历中的最小数值。

示例代码(Java)
在这里插入图片描述

执行结果
在这里插入图片描述

复杂度分析

  • 时间复杂度O(m2n):统计连续1的个数:O(mn);计算以矩阵点为右下角的矩阵面积:O(m2n),因此,时间复杂度为O(m2n)。
  • 空间复杂度O(mn):需要rows[m][n]来存储统计连续1的数量。

如果你参考了 柱状图中最大的矩形-优化版暴力算法,可以发现其实这里只是把矩阵的长宽获取变成了对列和行的遍历统计。

2.2、方法二:栈

柱状图中最大的矩形中,我们不仅用了优化的暴力算法,还用到了一种比较常见的数据结构,将算法的时间和空间复杂度都降低了一个计算单位。那么这里是否也可以使用栈来实现呢?同样我们可以将每个计算后的矩阵面积进行存储,从而降低对所有矩阵点的遍历,降低算法的时间复杂度。具体栈操作与【柱状图中最大的矩形】中的栈方法相似,这里不在细说。它其实就是对每一列使用柱状图中最大的矩形-栈方法算法来计算矩形的面积。直接上代码噢~~

示例代码(Java)在这里插入图片描述

执行结果
在这里插入图片描述

复杂度分析

  • 时间复杂度:O(mn)
  • 空间复杂度:O(n)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值