首页 > 编程语言 > 详细

求数组中的最大连续子序列和

时间:2020-06-04 10:16:19      阅读:40      评论:0      收藏:0      [点我收藏+]

给定一个整数数组a,找到一个具有最大和的连续子数组(最少包含一个元素),返回其最大和。

用数组T[i] 来保存 当前最大的连续子数组,算法的思想大体是这样的,循环遍历每个数,然后每次检验d[i-1] 是否大于零,只要大于零就 T[i] = T[i-1]+a[i] ,如果d[i-1]<0 ,那么直接d[i]=a[i]
算法核心: T[i] = T[i-1]>=0?T[i-1]+a[i]:a[i]

按照上面算法核心走一遍
[-2]                          T[1] = -2;   在只有一个数的时候,他就是最大连续的最大和子数组
[-2,1]                         T[2] = 1;  T[1] =-2 <0 所以前面的最大连续和是负数,a[2]加上它们肯定会变小,所以直接不要它
[-2,1,-3]                      T[3] = T[2]+a[3] =-2; T[2] =1>=0 所以在i之前的最大连续是正数,肯定要加上它
[-2,1,-3,4]                    T[4] = 4; T[3] < 0
[-2,1,-3,4,-1]                 T[5] = T[4] +a[5] = 3 ;  T[4]>0
[-2,1,-3,4,-1,2]               T[6] = T[5]+a[6] =5; T[5]>0
[-2,1,-3,4,-1,2,1]             T[7] = T[6]+a[7] =6; T[6]>0
[-2,1,-3,4,-1,2,1,-5]          T[8] = T[7]+a[8] =1;T[7]>0
[-2,1,-3,4,-1,2,1,-5,4]        T[9] = T[8]+a[9] =5; T[8]>0

只需再遍历T[i],取出数组中最大数数即可,或者每一遍历的使用m来记录T[i] 的最大值,具体算法过程如下。

int getMaxSequnceSum(int[] a,int len){

    int* T = new int[len];
    T[0] = a[0];
    for(int i=1;i<len;i++){
      if(T[i-1]>0){
        T[i] = a[i]+T[i-1];
      }else{
        T[i] = a[i];
      } 
    }
    
    int maxSequnceSum = T[0];
    for(int i=1,i<len,i++){
      if(T[i]>max){
         maxSequnceSum = T[i]
      } 
    }
   delete [] T;
return maxSequnceSum; }

 以上两个循环可以合并为一个。

求数组中的最大连续子序列和

原文:https://www.cnblogs.com/shijianchuzhenzhi/p/13041383.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!