子数组和最大

我和我的结对伙伴高晓林上课先进行讨论和分析,刚开始就想把所有的子数组的和全都求出来,然后求出最大值。先从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

posted on 2014-03-10 22:28  黄冠2011  阅读(217)  评论(0编辑  收藏  举报

导航