📜  在二维数组中找到Plus形状图案的最大和(1)

📅  最后修改于: 2023-12-03 15:37:39.900000             🧑  作者: Mango

在二维数组中找到Plus形状图案的最大和

问题描述

给定一个 $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