面試題31.連續子數組的最大和

題目:輸入一個整型數組,數組裏有正數也有負數。數組中一個或者連續多個整數組成一個子數組。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 }

運行截圖:

相關文章
相關標籤/搜索