本次的题目是:返回一个整数数组中最大子数组的和
要求:
1.输入一个整形数组,数组里有正数也有负数。
2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3.求所有子数组的和的最大值。要求时间复杂度为O(n)
分析:
当我们求出的累加和加上一个正数的时候,整个累加和就会增加,当我们的累加和加上一个负数的时候,整个累加和就会减小,我们用一个变量max保存累加和的最大值,另外,我们的累加和如果为负数的时候,如果继续加数不把累加和清零的话,那么整个和就会减小,因此如果累加和为负,就把累加和清零,最后,起初的max值为0,如果循环完后max的值继续为0,则说明数组里的数,全为负数,全为0,有0有负数。那么只需要求数组最大值即可。
#include<iostream> using namespace std; #define N 1000 int main() { int num,value,max=0; int val[N]; int firstNum=0,lastNum=0; //最大子数组开始位置(firstNum),结束的位置(lastNum) cout<<"输入数的个数:"; cin>>num; for(int i=0;i<num;i++) { cin>>val[i]; } value=0; for(int i=0;i<num;i++) //找出最大子数组 { value=value+val[i]; if(value>max) //累加和大于max,累加和赋值给max { max=value; lastNum=i; } if(value<0) // 当前和小于0,重置为0 { value=0; firstNum=i+1; } } if(max==0) // 最大和依然为0,说明数组中所有元素都为负值 { max=val[0]; firstNum=0; lastNum=0; for(int j=0;j<num;j++) { if(max<val[j]) { max=val[j]; firstNum=j; lastNum=j; } } } cout<<"最大子数组是:"; for(int i=firstNum;i<=lastNum;i++) { cout<<val[i]<<" "; } cout<<endl; cout<<"最大子数组的和为:"; cout<<max<<endl; return 0; }
结果截图:
小组成员:杨涛 http://www.cnblogs.com/GloryYT/