zoukankan      html  css  js  c++  java
  • 返回一个整数数组中最大子数组的和

    要求:

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

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

    求所有子数组的和的最大值。要求时间复杂度为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;
    }

    结果截图:

     总结:

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

  • 相关阅读:
    Flask学习笔记(10):钩子函数
    Flask学习笔记(8):csrf攻防
    Flask学习笔记(7):flask-migrate
    Flask学习笔记(6):flask-script
    Flask学习笔记(5):session
    Flask学习笔记(4):cookie
    Flask学习笔记(3):上传文件
    WTForm表单验证
    WINDOWS CMD命令小集
    Alembic环境配置与基本操作
  • 原文地址:https://www.cnblogs.com/lijiawei1-2-3/p/12372904.html
Copyright © 2011-2022 走看看