📜  二维矩阵中的最大和矩形| DP-27(1)

📅  最后修改于: 2023-12-03 15:36:03.759000             🧑  作者: Mango

二维矩阵中的最大和矩形

  • 本题属于DP问题的一种,利用动态规划的思想。
问题描述

给定一个二维数组,找出一个子矩阵使得其元素和最大,并返回最大值。

算法思路
  • 将原有的二维数组转换为一维数组(按列遍历),假设以第 i 行为底的矩阵的最大值为 max_sum_i。
  • 对于每一行 i,更新 max_sum_i,若其比已有的最大和还大,则更新 res。
  • 涉及到1D的子矩阵最大子段和问题,可以参考Maximum Subarray Problem,这是一个非常典型的DP问题,时间复杂度为O(n)。
代码实现
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 0:
            return 0
        if n == 1:
            return nums[0]
        cur_sum = max_sum = nums[0]
        for i in range(1, n):
            cur_sum = max(nums[i], cur_sum + nums[i])
            max_sum = max(max_sum, cur_sum)
        return max_sum
    
    def maxSumSubmatrix(self, matrix: List[List[int]]) -> int:
        if not matrix:
            return 0
        m, n = len(matrix), len(matrix[0])
        res = -float('inf')
        for i in range(m):
            total = [0] * n
            # 将当前列到第j列所有行的元素按列累加,变成一个1D数组
            for j in range(i, m):
                for k in range(n):
                    total[k] += matrix[j][k]
                # 对当前1D数组进行最大子段和处理
                cur_sum, max_sum = 0, -float('inf')
                for t in range(n):
                    cur_sum = max(total[t], cur_sum + total[t])
                    max_sum = max(cur_sum, max_sum)
                res = max(res, max_sum)
        return res
时间复杂度分析

整个算法的时间复杂度为:O(m²n),其中m和n分别表示二维矩阵的行和列。