• 返回一个整数数组中最大子数组的和


    要求:

    输入一个整形数组,数组里有正数也有负数。

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    求所有子数组的和的最大值。要求时间复杂度为O(n)

    设计思想:

    从总左边(a[0])开始遍历整个数组,一直到最右边结束(a[n-1]),在这个过程中记录到目前为止最大的子数组和maxsofar。maxsofar初始化成0。假如我们已经找到a[0]到a[n-1]之间的最大子数组和,那么a[0]到a[i]之间的最大子数组和是怎样的呢?要么“还是a[0]到a[i-1]之间的最大子数组和”,要么是“从a[i]开始,往前几个连续的数的最大值”。 在求从a[i]开始,往前几个连续的数的最大值时,用到如下性质:从a[i]开始往前几个连续的数的最大值maxending_i等于(maxending_i-1)+a[i]和0两者之中的最大值,即maxending_i=max((manending_i-1)+a[i],0)。

    代码:

    #include<iostream>
    using namespace std;
    int max(int a,int b)
    {
       if(a>b)
       {
          return a;
       }
       else
       {
          return b;
       }
    }
    int maxsum(int a[], int n)
    {
       int i;
       int maxsofar = 0;
       int maxendinghere = 0; 
       for (i = 0; i < n; i++)
       {
          maxendinghere = max(maxendinghere + a[i], 0);
          maxsofar = max(maxsofar, maxendinghere);
       }
       return maxsofar;
    }
    int main()
    {
       int n, i=0;
       cout<<"请输入个数:";
       cin>>n;
       cout<<"请输入数组:";
       int a[100000]={0};
       for(i=0;i<n;i++)
       {
          cin>>a[i];
       }
       int max=maxsum(a, n);
       cout << "最大子数组的和为:" << max << endl;
       return 0;
    }

    结果截图:

     总结:

    这次课堂实验让我明白了程序算法思维的重要性,算法优化的重要性,这样可以快速获得解题的方法,虽然代码不是自己的,但是经过反复运行之后已经十分理解了,所以这次试验我收获很多,下次课堂实验我会更加用心,学习到更多知识,让我更上一层楼。

  • 相关阅读:
    SQL SERVER2017 安装程序无法与下载服务器联系。无法安装机器学习服务的问题解决方式
    Kali Linux无法访问网络的问题
    Vue的冒泡事件
    记录阿里云ECS(Centos7.4)安装mysql 8.0.X服务
    沧桑巨变中焕发青春活力-记极1s HC5661A 打怪升级之路
    Asp.Net MVC过滤器小试牛刀
    C# Windows Service调用IBM Lotus Notes发送邮件
    记录一些js框架用途
    vc14(vs2015) 编译php7 记录
    C++ API方式连接mysql数据库实现增删改查
  • 原文地址:https://www.cnblogs.com/lijiawei1-2-3/p/12372904.html
Copyright © 2020-2023  润新知