最大子矩阵和
题目
给定一个正整数、负整数和 0 组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。
返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。
示例:
输入:
[
[-1,0],
[0,-1]
]
输出: [0,1,0,1]
解释: 输入中标粗的元素即为输出所表示的矩阵
分析
这题是Leetcode: 53. 最大子数组和问题的进阶
用示例的例子,可以将矩阵每列求和,就得到了一个数组[-1, -1]
,这个数组的最大子数组和就表示
行0-1
中的最大子矩阵和.
最大子矩阵和的问题可以看成求i-j
行中的最大子矩阵和, 对于示例来说就是0行,1行,0-1行分别做列求和[-1, 0]
,[0, -1]
,[-1, -1]
三个数组中最大的子数组和.
解
class Solution:
def getMaxMatrix(self, matrix: List[List[int]]) -> List[int]:
m, n = len(matrix), len(matrix[0])
maxv = float("-inf") # 最大子矩阵和
ans = [0, 0, 0, 0] # 最大子矩阵端点
for r1 in range(m):
for r2 in range(r1, m):
arr = [sum([matrix[r][c] for r in range(r1, r2+1)]) for c in range(n)] # i-j行矩阵做列求和
# 动态规划求解arr的最大子数组和
di = arr[0]
c1 = 0
if di > maxv:
maxv = di
ans = [r1, c1, r2, c1]
for i in range(1, n):
if di >= 0:
di = di + arr[i]
else:
di = arr[i]
c1 = i
if di > maxv:
maxv = di
ans = [r1, c1, r2, i]
return ans
标签:r1,r2,di,矩阵,数组,c1,最大
From: https://www.cnblogs.com/houjiaqi/p/18521260