題目描述:
輸入一個整形數組,數組里有正數也有負數。 數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。 求所有子數組的和的最大值。要求時間復雜度為O(n)。
例如輸入的數組為8,-4,6,-1,3,7,2,-3,和最大的子數組為8,-4,6,-1,3,7,2, 因此輸出為該子數組的和21。
思路分析:
求一個數組的最大子數組和,如輸入的數組為8,-4,6,-1,3,7,2,-3。由於要考慮到時間復雜度,即要盡量減少for的循環遍歷次數,我和丹丹討論了一下,想到了時間復雜度
為O(n)的算法如下:
#include<iostream.h>
int maxsum(int*a,int n)
{
int sum=0;
int c=0;
for(int i=0;i<n;i++)
{
if(c<0)
c=a[i];
else
c+=a[i];
if(sum<c)
sum=c;
}
return sum;
}
int main()
{
int a[8]={8,-4,6,-1,3,7,2,-3};
cout<<maxsum(a,8)<<endl;
return 0;
}
運行結果如下:

考慮到數組全是負數的情況,我和丹丹又對程序做了一些改變:
#include <iostream.h> #define n 8 int maxsum(int a[n]) { int max=a[0]; //如果是全負情況,返回最大數 int sum=0; for(int i=0;i<n;i++) { if(sum>=0) //如果加上某個元素,sum>=0的話,就加 sum+=a[i]; else sum=a[i]; //如果加上某個元素,sum<0了,就不加 if(sum>max) max=sum; } return max; } int main() { int a[]={-8,-4,-6,-1,-5,-7,-2,-3}; cout<<maxsum(a)<<endl; return 0; }
運行結果:
以上是我們對求數組的所有子數組的和的最大值程序設計的探討。
