我和我的结对伙伴高晓林上课先进行讨论和分析,刚开始就想把所有的子数组的和全都求出来,然后求出最大值。先从a[0]开始算以a[0]开头的所有字数组的和,再算出最大值,存在一个数组max[]里,然后再依次往后求以a[1],a[2]......a[n]开头向后的所有子数组的最大和,每一个开头都有一个子数组的最大和存进max[],最后再求出max[]里的最大值。
第一次的代码
#include <iostream> using namespace std; int quhe(int a[],int n) {
if(a==NULL||n==0)
{
cout<<"空数组!!";
return;
} int i,j,max; int sum[10]; sum[0]=a[n]; for(i=1;i<10-n;i++) { sum[i]=sum[i-1]+a[n+i]; } max=sum[0]; for(i=0;i<10-n;i++) { if(max<sum[i]) max=sum[i]; } return max; } int main() { int i,max,n; cout<<"输入数组个数:"; cin>>n; int * a=new int[n]; cout<<"输入这个数组:"; for(i=0;i<n;i++) { cin>>a[i]; } int * m=new int[n]; for(i=0;i<n;i++) { m[i]=quhe(a,i); } for(i=0;i<n;i++) { if(max<m[i]) max=m[i]; } cout<<max<<endl; return 0; }
后来想了想如何把时间复杂度变成O(n),然后稍微借鉴了一丁点网上的算法,改成如下
#include <iostream> using namespace std; int quhe(int a[],int n) { int i,max; int sum; sum=0; max=a[0]; for(i=0;i<n;i++) { if(sum<0) sum=a[i]; else sum=sum+a[i]; if(sum>max) max=sum; } return max; } int main() { int i,n; cout<<"输入数组个数:"; cin>>n; int * a=new int[n]; cout<<"输入这个数组:"; for(i=0;i<n;i++) { cin>>a[i]; } cout<<quhe(a,n)<<endl; return 0; }
测试了各种结果都正确
测试用例:
5个数 -2 -3 -4 -1 -4
结果是 -1
5个数 3 4 -2 3 -3
结果是 8
5个数 1 2 3 4 5
结果是15
5个数 -1 0 -3 -4 -5
结果是0