题目:返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。
要求时间复杂度为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<<" ";
}
运行结果截图:
总结:
代码看着比较简单,但逻辑思路一定要理清。注意全局变量与局部变量的区别。