题目
给定一个正整数、负整数和 0 组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。
返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。
示例:
输入:
[
[-1,0],
[0,-1]
]
输出:[0,1,0,1]
解释:输入中标粗的元素即为输出所表示的矩阵
分析: 我们知道一维数组和最大子序列可以用动态规划解决,见连续数列, 那么此题是二维数组,能否转化为一维数组解决呢,可以想到的是,确定矩阵的起始行数和终止行数,那么和最大的子矩阵将是由列的起始位置和终止位置决定,因此,确定了行数后,可以对矩阵按行求和,转化为一维数组, 然后再对这个一维数组找和最大子序列。行的起始位置和终止位置可以通过遍历法罗列所有可能的情况, 整体时间复杂度 O ( N 2 M ) O(N^2M) O(N2M)
class Solution:
def getMaxMatrix(self, matrix: List[List[int]]) -> List[int]:
matrix_coord = [0, 0, 0, 0]
max_sum = float("-inf")
m, n = len(matrix), len(matrix[0])
for i in range(m):
new_matrix = [0]*n
for j in range(i, m):
pre_sum = float("-inf")
start = 0
for k in range(n):
new_matrix[k] += matrix[j][k]
if pre_sum > 0:
cur_sum = pre_sum + new_matrix[k]
else:
cur_sum = new_matrix[k]
start = k
if cur_sum > max_sum:
max_sum = cur_sum
matrix_coord[0] = i
matrix_coord[1] = start
matrix_coord[2] = j
matrix_coord[3] = k
pre_sum = cur_sum
return matrix_coord