这个问题可以通过将二维问题转化为一维问题来解决。首先,我们通过计算矩阵的纵向前缀和来简化区间求和的操作。然后,通过固定子矩阵的上下界(top 和 bottom),将问题转换为求解固定行区间内部的最大子数组和,这一步使用类似Kadane算法的动态规划方法。对于每一对上下界,我们遍历所有可能的左右边界,计算这个矩形区间的和,并更新最大值。如果当前的累积和为负数,则重新开始计算新的子数组,否则继续累加。
时间复杂度: O(H^2 * W)
空间复杂度: O(H * W)
class Solution:
def getMaxMatrix(self, matrix: List[List[int]]) -> List[int]:
H, W, ans = len(matrix), len(matrix[0]), -sys.maxsize - 1
# 存储纵向前缀和
prefixSum = [[0 for _ in range(W)] for _ in range(H + 1)]
# 计算纵向前缀和
for i in range(1, H + 1):
for j in range(0, W):
prefixSum[i][j] = prefixSum[i - 1][j] + matrix[i - 1][j]
for top in range(H):
for bottom in range(top, H):
left = 0
dp = -sys.maxsize - 1
for right in range(W):
num = prefixSum[bottom + 1][right] - prefixSum[top][right]
if dp > 0:
dp += num
else:
dp = num
left = right
if dp > ans:
ans = dp
points = [top, left, bottom, right]
return points