• 软件工程概论课堂作业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<<" ";

    }

     运行结果截图

    总结

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

  • 相关阅读:
    baomi
    保密|原创解决您的后顾之忧
    为什么选择我们
    c++实现平面上的形状编辑
    完美售后提供完善修改服务
    冰山理论
    边集数组
    图的存储结构(十字链表、邻接多重表、边集数组) 数据结构和算法58
    邻接多重表
    邻接多重表
  • 原文地址:https://www.cnblogs.com/jianglingjun/p/5369341.html
Copyright © 2020-2023  润新知