zoukankan      html  css  js  c++  java
  • 子数组和最大

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

  • 相关阅读:
    php_sphinx安装使用
    获取数据库中所有表名
    总结thinkphp快捷查询getBy、getField、getFieldBy用法及场景
    打印机复印身份证方法
    svn 删除、移动和改名
    MySQL中REGEXP正则表达式使用大全
    高铁在高速运行时的电力是如何提供的?
    2016亚洲大学排名
    Mac下安装HBase及详解
    HBase Mac OSX 安装笔记
  • 原文地址:https://www.cnblogs.com/huangguan/p/3592846.html
Copyright © 2011-2022 走看看