【每日一题】最大正方形面积——进阶,矩形面积

2020/05/08 每日一题

221 最大正方形面积

在这里插入图片描述

是一道做过的题目出现在了每日一题,今后的每日一题我尽量把相关的题目都写一遍。

这道题目的思路并不是看到01矩阵就采用暴力的bfs方法,而是可以采用dp的思想。因为正方形具有不错的性质可以采用保存边长的方法,最后计算面积。

  • 核心dp:dp[i][j] = min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j])+1。寻找三个位置的最小值。
class Solution:
    def maximalSquare(self, matrix: List[List[str]]) -> int:
        n = len(matrix)
        if not n:
            return 0
        m = len(matrix[0])
        dp = [[0]*(m+1) for _ in range(n+1)]
        ans = 0
        for i in range(1, n+1):
            for j in range(1, m+1):
                if matrix[i-1][j-1] == '1':
                    dp[i][j] = min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j])+1
                    ans = max(dp[i][j], ans)
        return ans*ans

85 最大矩形面积

将问题从正方形变成最大矩形,问题就复杂了一下。
正方形的设计很固定的,我们上一个问题中,给定一个点,计算左上方的大小。但是对于长方形,即使你知道这个点是长方形的右下角,但是也无法确定长方形是躺下还是立起来的。

因此这里采用一种全新的dp思路。给定一个点(i,j)我们首先向上伸展得到最大的高度,然后分别计算出左右伸展可以达到的坐标。这样可以计算以该点伸展开的长方形的大小。

核心在于如何维护左右伸展,我们需要保证在同一列中连续出现1时维护一个最紧的边界。

具体我在代码中进行了注释,这段代码其实用到了状态压缩。

class Solution {
   
    public int maximalRectangle(char[][] ma
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值