給定一個整數數組(有正數有負數),找出總和最大的連續數列,並返回總和。

1、什麼是求最大連續子數列和算法

首先來看看這是個怎樣的問題的,問題描述:一個整型數組,數組裏有正數也有負數。數組中連續的一個或多個整數組成一個子數組,每一個子數組都有一個和,求全部子數組的和的最大值。注意:當全是負數的狀況時,返回最大的那個負數數組

 

2、解題思路app

這個問題的思路其實很是簡單,從左到右掃描數組,在掃描過程當中,記錄數組的負數的個數和掃描過中數據中的最大值,並累加每一個掃描到的數據的和,假設用變量thisSum(初值爲0)保存,若是當前的累加值大於以前的累加值的最大值 (例如用變量sum記錄,初值爲0),則把當前的最大值保存爲最大值(sum = thisSum),若是thisSum小於0,則把thisSum設置爲0並從新進行累加。一直這樣掃描數組,直到把數組掃描完。測試

 

因爲thisSum已經小於0,也就是說以前統計的和能夠捨棄,由於把當前的元素累加以後,結果反而小了。例如把數組分紅三部分AiB,由於A的值大於0,A+i的值小於0,因此若是從B開始重新累加,則其值必定比包括i而後去累加B的結果大,由於i小於0,而B中的和卻不必定比在A以前累加的和大。ui

 

因爲若是數組全是負數時,要返回最大的負數,而從上面所說的說法中,咱們能夠看到當前累加總和(thisSum)老是與0進行比較,若是小於0則把thisSum置爲0,因此當數組全是負數時,thisSum和數組的最大子序列之和(sum)老是爲0,而與現實有點不同,因此就要記錄負數的數量,當負數的數量等於元素的個數(即全是負數)時,就要把最大連續子序列和置爲最大的負數。這也是前面所說的,在掃描過程當中記錄負數的個數和最大元素的做用。this

 

3、實現代碼spa

 

[cpp] view plain copy.net

print?blog

  1. int MaxSum(int* a,int n)  
  2. {  
  3.     int sum = 0; //用於記錄最大的連續子數組和  
  4.     int flag = 0;//用於記錄負數的個數  
  5.     int MaxNum = *a;//用於記錄數組中最大的數  
  6.     int ThisSum = 0;//用於記錄當前的連續子數組和  
  7.     for(int i = 0; i < n; ++i)  
  8.     {  
  9.         if(a[i] < 0) //若是無素爲負數,則把flag的值加1  
  10.             ++flag;  
  11.         if(MaxNum < a[i]) //記錄數組當前的最大值  
  12.             MaxNum = a[i];  
  13.         ThisSum += a[i]; //累加更新當前的子數組之和  
  14.         if(ThisSum > sum)  
  15.         {  
  16.             //若當前連續子數組之和大於記錄的子數組之和  
  17.             //則設置最大連續子數組之和爲當前的和  
  18.             sum = ThisSum;  
  19.         }  
  20.         else if(ThisSum < 0)  
  21.         {  
  22.             //若是當前連續子數組之和小於0,則拋棄以前的連續子數組,  
  23.             //今後元素的下一個元素從新計算連續子數組之和  
  24.             ThisSum = 0;  
  25.         }  
  26.     }  
  27.     //若全是負數,最大值爲數組中的最大無素  
  28.     if(flag == n)  
  29.         sum = MaxNum;  
  30.     return sum;  
  31. }  

咱們再來看看測試結果吧,測試代碼以下:ip

 

 

[cpp] view plain copy

print?

  1. int main()  
  2. {  
  3.     int a[100] = {1, -2, 3, 10, -4, 7, 2, -5};  
  4.     cout<<MaxSum(a,8)<<endl;  
  5.     return 0;  
  6. }  

運行結果以下:

 

從運行結果和測試數據來看,最大的連續子數組應該是3,10,-4,7,2.它們的和就爲18.

 

4、時間複雜度和空間複雜度分析

從代碼和上面的解說能夠看到,這個算法的時間複雜度只爲O(N),並且常數爲1,即只須要掃描一次數組便可完成任務。並且用到的輔助空間也很是少,只有四個變量,空間複雜度爲O(1)。

相關文章
相關標籤/搜索