子矩阵的最大累加和问题

题目

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值