二维矩阵中的最大和矩形

2025年3月17日 | 阅读 7 分钟

问题描述: 给定一个二维整数矩阵,我们的目标是找到具有最大可能和的矩形子矩阵。

这是一个经典的动态规划问题,可以使用以下三种方法中的任意一种来解决。

但考虑到各自的时间和空间复杂度,本文讨论了三种方法。

方法一:使用递归

输出

Maximum Sum Rectangle in a 2D Matrix

说明

findMaxSumRectangle 函数

该函数负责在输入矩阵中找到最大和子矩阵。它使用四个嵌套循环来遍历矩阵内所有可能的子矩阵。每个子矩阵使用 calculateSubMatrixSum 函数计算其元素之和,如果计算出的和大于当前最大和,则更新最大和。

calculateSubMatrixSum 函数

该函数计算由起始和结束行、列指定的给定子矩阵内元素的和。它使用两个嵌套循环遍历子矩阵,并累加元素之和。

在这种递归方法中,我们遍历所有可能的矩形维度(起始行和列,结束行和列),并使用 calculateSubMatrixSum 方法计算其和。

时间复杂度:O(n^4)

其中“n”是输入矩阵的行数或列数。

对于较大的测试用例,此方法可能会失败。

下面将使用一种称为动态规划的概念来讨论更高效的方法。

由于递归是动态规划的首要步骤,我们可以开始思考需要遵循的后续步骤。

由于存在重叠子问题,我们可以利用记忆化的概念。

方法二:使用记忆化

输出

Maximum Sum Rectangle in a 2D Matrix

时间复杂度:O(rows^2 * cols^2)

说明

findMaxSumRectangle 函数

该函数负责在输入矩阵中找到最大和子矩阵。它使用四个嵌套循环来遍历矩阵内所有可能的子矩阵。每个子矩阵使用 calculateSubMatrixSum 函数计算其元素之和,如果计算出的和大于当前最大和,则更新最大和。

calculateSubMatrixSum 函数

该函数计算由起始和结束行、列指定的给定子矩阵内元素的和。它使用记忆化技术,利用存储在 memo 矩阵中预先计算的累积和值,来高效地计算子矩阵的和。

由于记忆化的概念会使用额外的堆栈空间。

为了消除这一点,下面讨论了一种更高效的方法,该方法利用了动态规划中称为制表法(Tabulation)的概念。

方法三:制表法(Tabulation)

输出

Maximum Sum Rectangle in a 2D Matrix

时间复杂度:O(rows^2 * cols^2)

说明

findMaxSumRectangle 函数

该函数负责在输入矩阵中找到最大和子矩阵。它利用了两个关键步骤:

预计算累积和矩阵 (memo)

它初始化一个带有一个额外行和一个额外列的记忆化矩阵 (memo),用于存储子矩阵的累积和值。该矩阵通过迭代填充,每个单元格 (memo[i][j]) 存储由左上角 ([0][0]) 和右下角 ([i][j]) 形成的矩形之和。

遍历子矩阵

它使用四个嵌套循环来遍历所有可能的子矩阵起始和结束行、列对。对于每一对,它使用存储在 memo 矩阵中的累积和值来计算相应子矩阵中元素的和。

这是该代码的最优化版本。