文章目录
- 一、题目描述
- 示例 1
- 示例 2
- 示例 3
- 二、代码
- 三、解题思路
一、题目描述
在一个由 '0'
和 '1'
组成的二维矩阵内,找到只包含 '1'
的最大正方形,并返回其面积。
示例 1
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:4
示例 2
输入: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'
二、代码
代码如下:
import numpy as np
class Solution:def maximalSquare(self, matrix: List[List[str]]) -> int:row = len(matrix)col = len(matrix[0])result = 0for i in range(row):for j in range(col):if matrix[i][j] == "0":continueelif i != 0 and j != 0:if matrix[i][j-1] and matrix[i-1][j] and matrix[i-1][j-1] and int(matrix[i][j-1]) >0 and int(matrix[i-1][j]) >0 and int(matrix[i-1][j-1]) >0:matrix[i][j] = str(min(int(matrix[i][j-1]),int(matrix[i-1][j]),int(matrix[i-1][j-1])) + 1)if int(matrix[i][j]) > result:result = int(matrix[i][j])print(result**2)return result**2
三、解题思路
本题考验的对于数组的遍历判断操作,需要我们找出由1构成的最大的正方形面积。本题解采用动态规划的方法,由于当前所判断的结果对于之后的判断也有用上,所以使用动态规划的方法较好,如果采用暴力遍历的方式的话,则会导致运算超时。
具体思路如下:
以当前的坐标[i][j]为例,需要判断的是当前坐标的左,上,左上这3个点,对应的坐标为[i][j-1],[i-1][j],[i-1][j-1]
(如果坐标存在的话),判断这3个点是否都是大于0的,如果是,并且当前坐标[i][j]
不为0,则以上这4个点可以构成一个更大的正方形;如果不是,或者当前坐标[i][j]
等于0,则无法构成更大的正方形。
如果能够构成更大的正方形,则当前坐标[i][j]
则需要进行更新,更新方式为:选取其左、上、左上3个坐标中的最小值 + 1。
最后在每次进行更新操作时,记录下当前更新后的最大值,返回其平方数即可。