数组与矩阵---子矩阵的最大累加和问题

来源:互联网 发布:淘宝上的yizi是正品吗 编辑:程序博客网 时间:2024/06/05 20:17

【题目】

  给定一个矩阵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)。

【代码实现】

#python3.5def matrixMaxSum(mat):    if mat == None or len(mat) == 0 or len(mat[0]) == 0:        return    maxSum = -sys.maxsize    for i in range(len(mat)):    #从第i行开始        s = [0 for i in range(len(mat[0]))]        for j in range(i, len(mat)):    #计算第i行到第j行的累加和            curSum = 0            for k in range(len(mat[0])):    #计算一维数组的累加和                s[k] += mat[j][k]                curSum += s[k]                maxSum = max(maxSum, curSum)                curSum = curSum if curSum > 0 else 0    return maxSum