221. 最大正方形
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
输出: 4
题解:
方法一:暴力法
由于正方形的面积等于边长的平方,因此要找到最大正方形的面积,首先需要找到最大正方形的边长,然后计算最大边长的平方即可。
暴力法是最简单直观的做法,具体做法如下:
遍历矩阵中的每个元素,每次遇到 11,则将该元素作为正方形的左上角;
确定正方形的左上角后,根据左上角所在的行和列计算可能的最大正方形的边长(正方形的范围不能超出矩阵的行数和列数),在该边长范围内寻找只包含 11 的最大正方形;
每次在下方新增一行以及在右方新增一列,判断新增的行和列是否满足所有元素都是 11。
代码:
class Solution:
def maximalSquare(self, matrix: List[List[str]]) -> int:
if len(matrix) == 0 or len(matrix[0]) == 0:
return 0
maxSide = 0
rows, columns = len(matrix), len(matrix[0])
for i in range(rows):
for j in range(columns):
if matrix[i][j] == '1':
# 遇到一个 1 作为正方形的左上角
maxSide = max(maxSide, 1)
# 计算可能的最大正方形边长
currentMaxSide = min(rows - i, columns - j)
for k in range(1, currentMaxSide):
# 判断新增的一行一列是否均为 1
flag = True
if matrix[i + k][j + k] == '0':
break
for m in range(k):
if matrix[i + k][j + m] == '0' or matrix[i + m][j + k] == '0':
flag = False
break
if flag:
maxSide = max(maxSide, k + 1)
else:
break
maxSquare = maxSide * maxSide
return maxSquare