最大子矩阵和

题目

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
posted @ 2024-11-01 21:58  侯佳奇  阅读(39)  评论(0)    收藏  举报