最大子矩阵和

题目

Leetcode: 面试题 17.24. 最大子矩阵

给定一个正整数、负整数和 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

__EOF__

本文作者侯佳奇的博客
本文链接https://www.cnblogs.com/houjiaqi/p/18521260.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   侯佳奇  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示