題目:輸入一個整型數組,數組裏有正數也有負數。數組中一個或者連續多個整數組成一個子數組。ios
求全部子數組的和的最大值。要求時間複雜度O(n)算法
本題能夠把全部子數組所有找出來再求其和的最大值即可以得出,可是這樣會致使算法的時間複雜度數組
爲0(n^2),因此有兩種方法來解決這個問題。spa
方法1.數組掃描code
咱們掃描一遍數組而且累加數組元素的和,當遇到累加和爲負數的時候,咱們從數組中blog
下一個元素開始從新累加。直到遍歷完成。io
方法2.動態規劃的方法class
有這樣一個公式stream
{ pdata[i] if f(i-1)<=0遍歷
f(i){
{f(x-i)+pdata[i] if f(i-1)>0
怎麼理解呢,f(i)是一個數組,其表明數組中第1-i個子數組的最大和,當f(i-1)爲負的時候,此時加上一個pdata[i]會更小
因此f(i)=pdata[i]
當f(i-1)爲正的時候,此時加上一個pdata[i]會更大,因此f(i)=f(i-1)+pdata[i];
下面咱們分別實現兩種方法:
第一種掃描法(若是隻想找最大的則沒必要找出最大子數組究竟是哪些元素,複雜度0(n))
1 #include <iostream> 2 using namespace std; 3 4 5 int FindSerialMaxSum(int* pData,int nLength) 6 { 7 int CurrSum=0; 8 int MaxSum=0; 9 10 if(pData==NULL||nLength==0) 11 return 0; 12 int *ChildArray=new int[nLength]; 13 for(int k=0;k<nLength;k++) 14 ChildArray[k]=0; 15 16 int index=0; 17 18 for(int i=0;i<nLength;i++) 19 { 20 if(CurrSum<=0) 21 { 22 CurrSum=pData[i]; 23 for(int j=0;j<nLength;j++) 24 ChildArray[j]=0; 25 index=0; 26 ChildArray[index]=pData[i]; 27 } 28 else 29 { 30 CurrSum+=pData[i]; 31 index++; 32 ChildArray[index]=pData[i]; 33 } 34 35 if(CurrSum>MaxSum) 36 MaxSum=CurrSum; 37 } 38 39 int Temp=0; 40 cout<<"The Child Array is : "; 41 for(int l=0;pData[l]!=0;l++) 42 { 43 if(Temp==MaxSum) 44 { 45 break; 46 } 47 Temp+=ChildArray[l]; 48 cout<<ChildArray[l]<<" "; 49 } 50 cout<<endl; 51 52 return MaxSum; 53 } 54 55 int main(int argc ,char* argv[]) 56 { 57 int pdata[]={1,-2,3,10,-4,7,2,-5}; 58 int nLength=8; 59 int SerivalSum=FindSerialMaxSum(pdata,nLength); 60 if(SerivalSum!=0) 61 cout<<"The Serial Max Sum = "<<SerivalSum<<endl; 62 else 63 cout<<"Input error!"<<endl; 64 system("pause"); 65 return 0; 66 }
運行結果:
2.動態規劃的方法(f(i)爲存儲0-i子數組的最大和)
1 #include <iostream> 2 using namespace std; 3 4 5 int FindSerialMaxSum(int* pData,int nLength,int* f) 6 { 7 f[0]=pData[0]; 8 int MaxSum=0; 9 for(int i=1;i<nLength;i++) 10 { 11 if(f[i-1]<=0) 12 { 13 f[i]=pData[i]; 14 } 15 else 16 { 17 f[i]=f[i-1]+pData[i]; 18 } 19 20 if(f[i]>MaxSum) 21 MaxSum=f[i]; 22 } 23 for(int k=0;k<nLength;k++) 24 { 25 cout<<f[k]<<" "; 26 } 27 cout<<endl; 28 return MaxSum; 29 } 30 31 int main(int argc ,char* argv[]) 32 { 33 int pdata[]={1,-2,3,10,-4,7,2,-5}; 34 int nLength=8; 35 int *f=new int[nLength]; 36 int SerivalSum=FindSerialMaxSum(pdata,nLength,f); 37 if(SerivalSum!=0) 38 cout<<"The Serial Max Sum = "<<SerivalSum<<endl; 39 else 40 cout<<"Input error!"<<endl; 41 delete[] f; 42 system("pause"); 43 return 0; 44 }
運行截圖: