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

}

 运行结果截图

总结

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

原文地址:https://www.cnblogs.com/jianglingjun/p/5369341.html