class Solution(object):
def maximalSquare(self, matrix):
if not matrix or not matrix[0]:
return 0
m, n = len(matrix), len(matrix[0])
dp = [[0] * (n + 1) for _ in range(m + 1)]
max_area = 0
for i in range(1, m + 1):
for j in range(1, n + 1):
if matrix[i - 1][j - 1] == '1':
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1
current_area = dp[i][j] ** 2
if current_area > max_area:
max_area = current_area
return max_area
if not matrix or not matrix[0]:
return 0
首先检查输入的矩阵 matrix
是否为空或者第一行是否为空。如果满足其中任一条件,会立即返回 0,因为在一个空矩阵中无法找到正方形。
if matrix[i - 1][j - 1] == '1':
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1
检查当前元素是否为 '1'。如果是,我们才考虑更新 dp[i][j]
第二行动态规划公式更新 dp[i][j]
。它取左、上、和左上三个相邻位置的最小边长,并加 1,得到以当前位置为右下角的最大正方形的边长。
然后计算当前正方形面积,如果当前面积大于最大面积,这行更新 max_area
为当前面积。最后返回找到的最大正方形的面积。
这里有张官方的图更为直观:
最近期末周,很久没写题了。看到这题第一个想法是先创建一个面积列表1.先确定二位矩阵的中最小边a,即正方形最大边长。2.设i从(1,a)开始循环看是否有对应的正方形之和为4^(i-1),有即将对应和放入面积列表。3.如果循环中有值找不到对应面积和,直接退出输出面积列表最后一个值。
但是我该如何确定是否有存在的正方形呢?我打算先穷举,从上到下从左到右,存在相应面积即退出进入下一轮循环(i+1)。但我发现这样并不好操作,首先不确定中心点坐标,其次不确定周围范围。一个循环好像解决不了,而且并没有用到动态规划。另外,我们不能确定i是在左半边正方形还是右半边正方形,也就是说大范围也不确定。
我又想到是否可以通过上一次的点作为中心点,拓展周围范围呢?
这是第一次写出的代码,修改逻辑错误后能运行,但似乎只有为0的示例能正常输出。
这里修改了for循环中的i,j范围,原本写的+1显示超范围,于是我删掉了,后来发现是m,n弄反了,修改后没有恢复原本的范围,导致范围小了。
现在为1的情况也能成功,但是大面积还是不行。
对于循环条件:如果上述条件为假(即 list1
不为空且不存在四倍关系),这行将返回 list1
中的最后一个面积。然而,这个逻辑是错误的,因为它会在找到第一个不满足四倍关系的面积时立即返回,而不是继续搜索最大面积。所以这个想法放弃。根据题目的要求,我们实际上只需要遍历 dp
矩阵一次,找到最大的边长,并返回其平方作为最大正方形的面积。不需要使用 list1
列表或检查面积之间的四倍关系。