LeetCode(最大正方形)

214 阅读3分钟

题目内容

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

示例 1:

image.png

输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:4

示例 2:

image.png

输入:matrix = [["0","1"],["1","0"]]
输出:1

示例 3:

输入:matrix = [["0"]]
输出:0

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 300
  • matrix[i][j] 为 '0' 或 '1'

编码思考

首先可以想到暴力解法,以当前节点为起点来构造正方形,然后取出最大的正方形,然后转念一想呵肯定会超时的!

之后仔细审题后发现可以使用动态规划,只需要找到当前节点是否满足构造正方形即可,解释一下就是将当前节点转换为正方形最后的一个节点。

编码流程

首先我们需要将数组中的字符串转换为数字为了后续方便操作,然后判断当前点是否满足值为1并且其左,上以及左上值为1即可以判断此点可以满足正方形的条件。最后找出最大值乘方可以获得最大正方形。

代码展示

class Solution(object):
    def maximalSquare(self, matrix):
        """
        :type matrix: List[List[str]]
        :rtype: int
        """
        res = 0
        for i in range(len(matrix)):
            for j in range(len(matrix[0])):
                matrix[i][j] = int(matrix[i][j])
                if matrix[i][j] == 1:
                    if i - 1 < 0 or j - 1 < 0:
                        res = max(res, 1)
                    else:
                        matrix[i][j] = min(matrix[i - 1][j], matrix[i - 1][j - 1], matrix[i][j - 1]) + 1
                        res = max(res, matrix[i][j])
        return res ** 2

image.png

代码解释(AI生成的修改版)

这段代码是一个解决方案类(Solution)中的一个方法(maximalSquare),用于计算一个二维矩阵(matrix)中最大的正方形的面积。

以下是对代码的详细解释:

  • class Solution(object):定义了一个名为 Solution 的类,它继承自 Python 的内置对象 object
  • def maximalSquare(self, matrix):定义了一个名为 maximalSquare 的方法,它接受一个二维列表作为参数(matrix)。self 是一个特殊的参数,用于引用当前的类实例。
  • res = 0:定义了一个变量 res,用于存储最大正方形的边长。
  • for i in range(len(matrix)):遍历矩阵的行数。
  • for j in range(len(matrix[0])):遍历矩阵的列数。
  • matrix[i][j] = int(matrix[i][j]):将矩阵中的每个元素转换为整数。
  • if matrix[i][j] == 1:如果当前元素为 1,则继续处理。
  • if i - 1 < 0 or j - 1 < 0:检查左边和上边是否有边界,如果没有,则将 res 更新为 1,因为一个单独的 1 也是一个正方形。
  • else:如果左边和上边有边界,则继续处理。
  • matrix[i][j] = min(matrix[i - 1][j], matrix[i - 1][j - 1], matrix[i][j - 1]) + 1:计算当前元素左边、上边和左上边的最小值,并加 1,得到当前元素所在正方形的边长。
  • res = max(res, matrix[i][j]):更新最大正方形的边长。
  • return res ** 2:返回最大正方形的面积。

总结:这段代码通过遍历二维矩阵,找到最大的正方形,并返回其面积。