原本以为这又是一道需要dfs的题,没想到行不通,最后找到一种思路——使用动态规划。
将所有的str转为int
如图所示:
蓝圈所指位置是正方形的右下角位置,若能组成正方形,则该位置的左上方所有位置都得是1.
由上图可得公式:
matrix[i][j] = min(matrix[i-1][j-1], matrix[i-1][j], matrix[i][j-1]) + 1
只计算边长,最后返回边长的平方即为面积。
class Solution:
def maximalSquare(self, matrix: List[List[str]]) -> int:
ans = 0
m, n = len(matrix), len(matrix[0])
for i in range(m):
for j in range(n):
matrix[i][j] = int(matrix[i][j])
if m >= 2 and n >= 2:
for i in range(1, m):
for j in range(1, n):
if matrix[i][j] == 1:
matrix[i][j] = min(matrix[i-1][j-1], matrix[i-1][j], matrix[i][j-1]) + 1
for i in range(m):
for j in range(n):
ans = max(ans, matrix[i][j])
return ans*ans