子数组的最大累加和已经子矩阵的最大累加和思路以及伪代码

昨天晚上是一种暴利解法求解子数组的累加和,下面是另一种解法以及其它变体

思路2:单向扫描求和,如果是累加和为负数则丢弃,
正数的时候则继续,最后返回max,,, //这个思路可以记住
findSum2(int arr[])//算法的复杂度为On
    sum=arr[0]
    max=sum
    int left=0,right=0
    for(i=1;i<length;i++)
       if (sum>=0)
           sum+=arr[i]
       else
           sum=arr[i]//重新定义新的起点位置
           left=i            
    if(sum>max)
       max=sum
       right=j //更新max的时候更新right
    return max;

    

求子矩阵的最大累加和
思路不提倡暴利解法因为暴利解法会造成复杂度是n的4次方
用思路2:对于每一行首元素可以单独进行累加求和,
有3+2+1个划分。所以有N的平方,每个划分利用列求和的方法在查找最大和可以
利用上面的n的复杂度求和,所以总共是n的3次方。
伪代码如下:
finsumMax(int[][]maxtrix)
    sumi=maxtrix[0][0]
    for i =0;i<n;i++
       max =0
       maxi=findsum2(maxtrix[i])
       if maxi>0
          max+=maxi

maxSum(int[][]mat)
   int beginRow=0 //起始行
   int M=mat.length 行的长度
   int N=mat[0].length 列的长度
   int []sums=new int[N] 按列求和
   int max=0  历史最大的子矩阵的和
 while(biginRow<M) 
   for(int i=beginRow;i<M;i++)从起始行到第i行
      按列累加
      for(j=0;j<N;j++)
         sums[j]+=max[i][j]
      累加完成求出最大和子数组
      int t = findSum2(sums)
      if(t>max)
         max=t;
   Arrays.fill(sums,0)
   beginRow++;
  return max;

上面算法三层循环,第三层里面是两个n+n=2n所以还是On的级别
所以上面的复杂度为N的三次方

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值