題目描述:
輸入一個整形數組,數組里有正數也有負數。 數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。 求所有子數組的和的最大值。要求時間復雜度為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; }
運行結果:
以上是我們對求數組的所有子數組的和的最大值程序設計的探討。