首页 > 其他分享 >最大子矩阵和

最大子矩阵和

时间:2024-11-01 21:48:02浏览次数:1  
标签:r1 r2 di 矩阵 数组 c1 最大

最大子矩阵和

题目

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

标签:r1,r2,di,矩阵,数组,c1,最大
From: https://www.cnblogs.com/houjiaqi/p/18521260

相关文章