题目
给定一个矩阵matrix,其中的值有正、有负、有0,返回子矩阵的最大累加和。
例如,matrix为:
-1 -1 -1
-1 2 2
-1 -1 -1
其中最大累加和的子矩阵为:
2 2
所以返回4。
基本思路
首先看这样一个例子,假设一个2行4列的矩阵如下:
-2 3 -5 7
1 4 -1 -3
如何求必须含有2行元素的子矩阵中的最大累加和?可以把两列的元素相加,然后得到累加数组[-1, 7, -6, 4],接下来求这个累加数组的最大累加和,结果就是7,且这个子矩阵数:
3
4
也就是说,如果一个矩阵一共有k行且限定必须含有k行元素的情况下,我们只要把矩阵的每一列的k个元素累加生成一个累加数组,然后求出这个数组的最大累加和,这个最大累加和就是必须含有k行元素的子矩阵中的最大累加和。
对于整个N*N的矩阵来说,我们需要考虑以第一行开头的一行矩阵、两行矩阵、三行矩阵…N行矩阵;以及以第二行开头的一行矩阵、二行矩阵…N-1行矩阵;……以最后一行开头的一行矩阵。将所有的这些情况中的最大累加和找到即可。一共有O(N2)中情况,找到累加数组中最大累加和的时间复杂度是O(N),所以最终的时间复杂度是O(N3)。
def matrixMaxSum(m):
if m == None or len(m) == 0 or len(m[0]) == 0:
return
import sys
maxSum = -sys.maxsize
for i in range(len(m)):
s = [0 for i in range(len(m[0]))]
for j in range(i,len(m)):
curSum = 0
for k in range(len(m[0])):
s[k] += m[j][k]
curSum += s[k]
maxSum = max(maxSum,maxSum)
if curSum >0:
curSum = curSum
else:
curSum = 0
return maxSum