如何在矩阵中求最大和的子矩阵?

来源:3-3 在LeetCode上解决第一个问题 Move Zeros

河水洗回忆

2018-04-14

leetcode中53号问题是求数组中的连续子数组的最大和,如果是矩阵,那么该如何求解这个矩阵中和最大的子矩阵呢?请问波波老师有什么好的解决思路?

写回答

1回答

liuyubobobo

2018-04-14

非常好的拓展。其实这是一个经典问题:)


一个标准解法是:穷举子矩阵的左边界和右边界,对于每一个左右边界,将每行左右边界的之间的元素和计算出来。之后,确定上下边界的过程等同于是连续子数组最大和的问题。


需要预处理一个sum[i][j],表示第i行arr[i][0] 到 arr[i][j]的所有元素和,这样可以在每次穷举到一个左右边界的时候,快速计算出每行左右边界之间的元素和。比如左边界为l,右边界为r,则第i行l到r的元素和为arr[i][r] - arr[i][l-1]。


整体时间复杂度为O(n^3),其中外层n^2用于遍历左右边界,内层n就是求解53号问题。


整体这个思想称为kadane's algorithm。其实核心是53号问题的1d表述。2d问题只是在左右边界上进行遍历,之后将2d问题转化成了1d问题。

1
1
河水洗回忆
非常感谢!
2018-04-14
共1条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7408 学习 · 1150 问题

查看课程