【算法】【动态规划篇】第8节:最大正方形问题(leetcode221. 最大正方形)

本期任务:介绍算法中关于动态规划思想的几个经典问题

【算法】【动态规划篇】第1节:0-1背包问题

【算法】【动态规划篇】第2节:数字矩阵问题

【算法】【动态规划篇】第3节:数字三角形问题

【算法】【动态规划篇】第4节:硬币找零问题

【算法】【动态规划篇】第5节:剪绳子问题

【算法】【动态规划篇】第6节:最低票价问题

【算法】【动态规划篇】第7节:最长子串问题

【算法】【动态规划篇】第8节:最大正方形问题

【算法】【动态规划篇】第9节:乘积最大子数组问题

【算法】【动态规划篇】第10节:最长连续序列问题


问题来源


221. 最大正方形
在一个由 01 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

示例:

输入:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

输出: 4

大佬解析

笔者思路:遍历每个二维矩阵的位置,计算以该点为右下角的最大正方形的边长,发现:

  • 第一行和第一列的位置仅可能为0/1,且仅取决于该位置是0/1:0->0, 1->1
  • 其余位置(i, j),其值由相邻的三个位置(i-1, j),(i, j-1),(i-1, j-1)决定:
    0->0, 1->min(matrix[i - 1][j], matrix[i][j - 1], matrix[i - 1][j - 1]) + 1

代码

"""
需求:
    在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

思路:
    遍历每个二维矩阵的位置,计算以该点为右下角的最大正方形面积,发现:
    1. 第一行和第一列的位置仅可能为0/1,且仅取决于该位置是0/1:0->0, 1->1
    2. 其余位置(i, j),其值由相邻的三个位置(i-1, j),(i, j-1),(i-1, j-1)决定:0->0, 1->min(matrix[i - 1][j], matrix[i][j - 1], matrix[i - 1][j - 1]) + 1

"""

class Solution:
    def maximalSquare(self, matrix) -> int:
        if not matrix:
            return 0

        row, col = len(matrix), len(matrix[0])
        max_area = 0
		
		# 整数化每个位置的值
        for i in range(row):
            for j in range(col):
                matrix[i][j] = int(matrix[i][j])
                if matrix[i][j]:
                    max_area = 1	# 因为第一行和第一列被跳过,所以需要检查是否全为0
                    
        # 直接在原矩阵上做修改,第一行和第一列故可直接跳过
        for i in range(1, row):
            for j in range(1, col):
                if matrix[i][j] == 1:
                    matrix[i][j] = min(matrix[i - 1][j], matrix[i][j - 1], matrix[i - 1][j - 1]) + 1
                    max_area = max(max_area, matrix[i][j]**2)	# 要求的是最大面积,故平方处理
        return max_area
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值