• 软件工程概论课堂作业2


    题目:返回一个整数数组中最大子数组的和。

    要求:

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

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。

    要求时间复杂度为O(n)

    发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选)、源代码、结果截图、总结。

    设计思想

    用户自定义数组长度并依次输入数组元素,设数组为a[N];

    1.因为是求一个数组子数组的最大值,所以应从数组第一个不为零的元素累加,设累加值为S,为判断数组第一个不为负的元素,S需要初始化为零;

    2.定义另一个整形变量sum存储当前最大累加值S,sum需与累加值比较,所以sum应初始化为零  (1)每一次累加获得一个S后判断,若S为负,舍去使累加值为负的数组元素,继续从下一个数组元素开始累加(2)若sum<S,把S赋值给sum,S继续累加(3)如此循环直到数组元素取尽。

    3.最后输出的sum为子数组最大值。

    出现的问题

    数组元素全为负的时候不能得出正确结果。

    可能的解决方案:

    遍历所有子数组的可能情况比较大小,但是不满足时间复杂度为O(n)。

    程序源代码

    //Jiang LingJun,   2016,04,06

    //数组中有正有负,求最大子数组问题

    #include<iostream>

    using namespace std;

    int a[10000];//全局变量(初始化数组a所有元素为零)

    void main()

    {

      int i,m;

      int sum=0;//初始化

      int s=0;

      cout<<"请输入数组长度 ";

      cin>>m;

      cout<<"请输入"<<m<<"个数:";//自定义数组长度

      for(i=0;i<m;i++)

        cin>>a[i];

      for(i=0;i<m;i++)

        {

          if(s<0)

            s=a[i];//舍去使子数组和小于零的数组元素

          else

            s=s+a[i];//临时存放数组元素的累加值

          if(sum<s)

            sum=s;//存放当前最大子数组的和

        }

       cout<<"该数组子数组和的最大值为:"<<sum<<" ";

    }

     运行结果截图

    总结

    代码看着比较简单,但逻辑思路一定要理清。注意全局变量与局部变量的区别。

  • 相关阅读:
    如何对Web Part进行调试 cloud
    相见恨晚的68句话,来给大家分享分享……(转载) cloud
    基于python的邮件地址提取小程序
    php.ini 核心配置选项说明
    Snort2.8.1在Windows上的简单使用
    在Visual Studio 2008中编译snort2.8.6.1.tar.gz
    PyDev for Eclipse 简介
    Python中*和**的用法
    Python实现类似switch...case功能
    ubuntu安装mysql多实例
  • 原文地址:https://www.cnblogs.com/jianglingjun/p/5369341.html
Copyright © 2020-2023  润新知