求數組中的最大連續子序列和


給定一個整數數組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; }

 以上兩個循環可以合並為一個。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM