当前位置: 面试刷题>> 最大矩阵边界和 (经典算法题500道)


### 题目描述 给定一个二维矩阵(矩阵中的元素都是整数),要求找到该矩阵中的一个子矩阵(可以是原矩阵本身),使得子矩阵边界上所有元素的和最大。这里的“边界”指的是子矩阵的最上面一行、最下面一行、最左边一列和最右边一列的所有元素。 ### 示例 考虑以下矩阵: ``` 1 0 3 0 5 -1 2 1 1 ``` 最大边界和的子矩阵可能是: ``` 0 5 2 1 ``` 边界和为 `0 + 5 + 2 + 1 = 8`。 ### 解题思路 1. **预处理行和与列和**:首先,计算矩阵的每一行和每一列的前缀和,以便快速计算任意子矩阵的边界和。 2. **枚举上下边界**:遍历矩阵的所有可能上下边界组合。 3. **利用哈希表优化查找**:对于每一对上下边界,使用哈希表(或数组)记录以当前列为右边界的列和,以便快速找到最优的左边界。 4. **更新最大边界和**:在遍历过程中,不断更新找到的最大边界和。 ### PHP 代码示例 ```php function maxMatrixBorderSum($matrix) { if (empty($matrix) || empty($matrix[0])) return 0; $m = count($matrix); $n = count($matrix[0]); // 计算行前缀和 $rowSums = array_fill(0, $m + 1, array_fill(0, $n + 1, 0)); for ($i = 1; $i <= $m; $i++) { for ($j = 1; $j <= $n; $j++) { $rowSums[$i][$j] = $rowSums[$i][$j - 1] + $matrix[$i - 1][$j - 1]; } } $maxSum = PHP_INT_MIN; // 枚举上下边界 for ($top = 1; $top <= $m; $top++) { for ($bottom = $top; $bottom <= $m; $bottom++) { $colSums = array_fill(0, $n + 1, 0); $maxLeft = 0; // 计算当前上下边界的列和 for ($j = 1; $j <= $n; $j++) { $colSums[$j] = $rowSums[$bottom][$j] - $rowSums[$top - 1][$j]; // 使用滑动窗口找到最优的左边界 $currentSum = $colSums[$j] + $colSums[$j] - $colSums[$maxLeft]; if ($j > $maxLeft && $colSums[$j] - $colSums[$maxLeft] > 0) { $maxLeft = $maxLeft; while ($maxLeft < $j && $colSums[$j] - $colSums[$maxLeft + 1] >= 0) { $maxLeft++; } } $maxSum = max($maxSum, $currentSum + $colSums[$maxLeft]); } } } return $maxSum; } ``` 注意:PHP 示例中的算法直接基于思路实现,可能不是最优解,特别是在处理列和的优化部分。实际应用中可能需要根据具体情况调整算法以提高效率。 ### Python 和 JavaScript 代码示例 由于篇幅限制,这里不直接展开 Python 和 JavaScript 的完整实现,但基本思路与 PHP 相同,主要涉及二维矩阵的前缀和计算、上下边界的枚举以及利用哈希表或数组优化左边界的查找。你可以根据 PHP 示例中的思路,在 Python 和 JavaScript 中实现相应的函数。 **码小课网站中有更多相关内容分享给大家学习**,包括但不限于算法基础、数据结构、面试技巧等,欢迎大家访问学习。
推荐面试题