面试题 17.24. 最大子矩阵

这篇博客讨论了一种解决寻找正整数、负整数和0组成的矩阵中元素总和最大的子矩阵的问题。通过动态规划的思想,首先将矩阵按行求和转化为一维数组,然后在一维数组中寻找最大子序列和。博主提供了详细的算法实现,包括关键的代码片段,并解释了如何通过遍历矩阵的所有可能起始行和列来确定最大子矩阵。
摘要由CSDN通过智能技术生成

题目

给定一个正整数、负整数和 0 组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。

返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。

示例:

输入:
[
   [-1,0],
   [0,-1]
]
输出:[0,1,0,1]
解释:输入中标粗的元素即为输出所表示的矩阵

分析: 我们知道一维数组和最大子序列可以用动态规划解决,见连续数列, 那么此题是二维数组,能否转化为一维数组解决呢,可以想到的是,确定矩阵的起始行数和终止行数,那么和最大的子矩阵将是由列的起始位置和终止位置决定,因此,确定了行数后,可以对矩阵按行求和,转化为一维数组, 然后再对这个一维数组找和最大子序列。行的起始位置和终止位置可以通过遍历法罗列所有可能的情况, 整体时间复杂度 O ( N 2 M ) O(N^2M) O(N2M)

class Solution:
    def getMaxMatrix(self, matrix: List[List[int]]) -> List[int]:
        matrix_coord = [0, 0, 0, 0]
        max_sum = float("-inf")
        m, n = len(matrix), len(matrix[0])
        for i in range(m):
            new_matrix = [0]*n
            for j in range(i, m):
                pre_sum = float("-inf")
                start = 0
                for k in range(n):
                    new_matrix[k] += matrix[j][k]
                    if pre_sum > 0:
                        cur_sum = pre_sum + new_matrix[k]
                    else:
                        cur_sum = new_matrix[k]
                        start = k
                    if cur_sum > max_sum:
                        max_sum = cur_sum
                        matrix_coord[0] = i
                        matrix_coord[1] = start
                        matrix_coord[2] = j
                        matrix_coord[3] = k
                    pre_sum = cur_sum
        return matrix_coord

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值