该题解采用动态规划的思想。首先,创建两个二维数组row和col,其中row[i][j]表示在grid[i][j]处,从该点向左连续的1的数量;col[i][j]表示在grid[i][j]处,从该点向上连续的1的数量。然后,遍历整个网格,对于每一个点(grid[i][j] == 1),我们检查以该点为右下角的正方形的最大边长。这里的最大边长取决于从该点向左和向上连续的1的数量(即row[i][j]和col[i][j]的较小值)。对于可能的每个边长,我们检查相应的左边界和上边界是否满足条件(即是否包含足够数量的连续的1)。如果满足条件,我们更新最大正方形的边长。最后,返回最大边长的平方,即最大正方形中的元素数量。
时间复杂度: O(mn * min(m, n))
空间复杂度: O(mn)
class Solution:
def largest1BorderedSquare(self, grid: List[List[int]]) -> int:
m, n = len(grid), len(grid[0])
row = [[0] * n for _ in range(m)]
col = [[0] * n for _ in range(m)]
max_l = 0
for i in range(m):
for j in range(n):
if grid[i][j] == 1:
row[i][j] = row[i][j-1] + 1 if j else 1
col[i][j] = col[i-1][j] + 1 if i else 1
cur_max = min(row[i][j], col[i][j])
while cur_max >= max_l:
x = i - cur_max + 1
y = j - cur_max + 1
if row[x][j] >= cur_max and col[i][y] >= cur_max:
max_l = cur_max
break
cur_max -= 1
return max_l ** 2