题目难度: 困难
今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~
给定一个正整数、负整数和 0 组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。
返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。
注意:本题相对书上原题稍作改动
[
[-1,0],
[0,-1]
]
sm < 0 的情况)max(sm+arr[i+1], arr[i+1])max(以各个下标结尾的最大和), 可以在遍历的时候顺带一起判断O(RRC): 两重循环得到矩阵的上下界 (O(RR)), 然后内部需要遍历两次列 (O©)O(C): 维护了一个长度为列数的数组class Solution:
def getMaxMatrix(self, matrix: List[List[int]]) -> List[int]:
rows, cols = len(matrix), len(matrix[0])
mxsm = -float("inf")
res = []
for lor in range(rows):
# 初始化以lor作为上边界的矩阵压缩成的一维数组
arr = [0] * cols
for hir in range(lor, rows):
for c in range(cols):
# 累加当前下边界hir的值
arr[c] += matrix[hir][c]
# 经典的子数组最大和问题
# 左边界, 初始化为0
loc = 0
sm = 0
for hic in range(cols):
sm += arr[hic]
if sm < arr[hic]:
# 从当前hic开始的前缀和更大, 则丢弃前面的前缀和, 并更新左边界为当前列号
sm = arr[hic]
loc = hic
if sm > mxsm:
# 找到总和更大的子矩阵了, 更新最终结果
mxsm = sm
res = [lor, loc, hir, hic]
return res
大家可以在下面这些地方找到我~😊