题目:原题链接(困难)
标签:数组、动态规划
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
Ans 1 (Python) | O ( N × M 2 ) | O ( N × M ) | 3288ms (29.62%) |
Ans 2 (Python) | |||
Ans 3 (Python) |
解法一(动态规划):
class Solution:
def getMaxMatrix(self, matrix: List[List[int]]) -> List[int]:
s1, s2 = len(matrix), len(matrix[0])
# 计算前缀和矩阵
# O(N×M)
T1 = [[0] * (s2 + 1) for _ in range(s1)] # 左上缀和
T1[0][1] = matrix[0][0]
for i1 in range(1, s1):
T1[i1][1] = T1[i1 - 1][1] + matrix[i1][0]
for i2 in range(1, s2):
T1[0][i2 + 1] = T1[0][i2] + matrix[0][i2]
for i1 in range(1, s1):
for i2 in range(1, s2):
T1[i1][i2 + 1] = matrix[i1][i2] + T1[i1 - 1][i2 + 1] + T1[i1][i2] - T1[i1 - 1][i2]
ans_idx, ans_val = [-1, -1, -1, -1], float("-inf")
# 计算前缀差矩阵
# O(N×M^2)
T2 = [[(0, -1)] * (s2 + 1) for _ in range(s2 + 1)] # 左上缀差
for i1 in range(s1):
for i2 in range(s2):
for i3 in range(i2, s2):
v1 = T1[i1][i3 + 1] - T1[i1][i2]
v2 = v1 - T2[i2][i3][0]
# print(i1, i2, i3, "->", v2, ":", (T2[i2][i3][1] + 1, i2), ",", (i1, i3), "(", T2[i2][i3], ")")
if v2 > ans_val:
ans_idx, ans_val = [T2[i2][i3][1] + 1, i2, i1, i3], v2
# print("[Maybe]", ans_idx, ans_val)
if v1 < T2[i2][i3][0]:
T2[i2][i3] = (v1, i1)
# T2[i2][i3] = min(T2[i2][i3], v)
return ans_idx