📅  最后修改于: 2023-12-03 15:37:39.900000             🧑  作者: Mango
给定一个 $n\times n$ 的二维数组 $a_{n,n}$,每个元素的取值为非负整数,设计一个算法找到一个 Plus 形状的图案,使得其中的元素之和最大,返回该最大值。
Plus 形状图案的定义如下:
Example 1:
Input: nums = [[1,0,1],[0,1,0],[1,0,1]]
Output: 4
Explanation: In the above grid, the largest plus sign can only be of size 2. One of them is shown.
为了计算一个 Plus 形状的图案的元素之和,我们可以先预处理一些信息;对于该数组的每个位置 $(i, j)$,可以向四个方向分别扩展,得到一个最大的左、右、上、下长度,用分别用 $left_{i,j}, right_{i,j}, up_{i,j}, down_{i,j}$ 表示。
接下来,我们可以枚举每个位置 $(i,j)$,以该位置为中心,计算一个 Plus 形状的图案的元素之和,即:
$$sum_{i,j}=a_{i,j}+\min(left_{i,j}, right_{i,j}, up_{i,j}, down_{i,j})$$
最后,遍历所有 $sum_{i,j}$ 的值,取最大值即可。
时间复杂度: $O(n^2)$
def max_plus_sum(a):
n = len(a)
left, right, up, down = [[0]*n for _ in range(4)]
for i in range(n):
for j in range(n):
if a[i][j] == 0:
left[i][j] = 0
up[i][j] = 0
else:
left[i][j] = left[i][j-1] + 1 if j > 0 else 1
up[i][j] = up[i-1][j] + 1 if i > 0 else 1
for i in range(n-1, -1, -1):
for j in range(n-1, -1, -1):
if a[i][j] == 0:
right[i][j] = 0
down[i][j] = 0
else:
right[i][j] = right[i][j+1] + 1 if j < n-1 else 1
down[i][j] = down[i+1][j] + 1 if i < n-1 else 1
max_sum = 0
for i in range(n):
for j in range(n):
sum_ij = a[i][j] + \
min(left[i][j], right[i][j], up[i][j], down[i][j])
max_sum = max(max_sum, sum_ij)
return max_sum
a = [[1,0,1], [0,1,0], [1,0,1]]
print(max_plus_sum(a)) # Output: 4