• 求数组的所有子数组的和的最大值


    题目描述:

    输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为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)的算法如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #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;    
    }    
    复制代码

    运行结果:

    以上是我们对求数组的所有子数组的和的最大值程序设计的探讨。

  • 相关阅读:
    每周一坑WAF防护域名主节点异常+阿里远程登录不了
    SmsForwarder转发阿里云登录验证码
    python统计IP段 (基础实现版)
    每周一坑nginx日志写不到elk索引
    阿里云WAF本地验证及误拦截处理
    php 1020
    php 1017
    php 1018
    php 1015
    php 1014
  • 原文地址:https://www.cnblogs.com/hfxdaj/p/3603633.html
Copyright © 2020-2023  润新知