返回一个整数数组中最大子数组的和2
要求:
要求程序必须能处理1000个元素;
每个元素是int32类型的,出现子数组之和大于整型表示的最大范围会出现什么情况;
输入一个整形数组,数组里有整数也有负数;
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;
求所有子数组的和的最大值,要求时间复杂度为O(n)。
第一段处理1000个元素:
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main()
{
int n,star=0,end=0; //n表示整型数组长度,star表示最大子数组起始位,end表示最大子数组终止位
cout<<"输入整型数组的长度:";
cin>>n;
int *p=new int[n];
srand((unsigned)time(NULL));
for(int i=0;i<n;i++)
{
p[i]=rand()%2000-1000; //随机取-1000~1000中的整数
}
for(int i=0;i<n;i++)
{
cout<<p[i]<<" "; //输出这1000个元素
if((i+1)%10==0) //每十个换行
{
cout<<endl;
}
}
int sum=p[0]; //子数组
int max_sum=p[0]; //最大子数组
for(int i=1;i<n;i++)
{
if(sum>0) //从第二个数开始判断是否为正数
{
if(p[i]>(INT_MAX-sum)) //加入了一段判断int类型数据是否溢出。
{
cout<<"int类型溢出"<<endl;
return 0;
}
sum=sum+p[i]; //是正数,将和值(初始值为p【0】)和第i+1个数做和。
if(sum>max_sum) // 并判断是否为最大,是让其赋值给max_sum,并将子数组末位置改变。
{
max_sum=sum;
end=i;
}
}
else
{
sum=p[i]; //是负数,将第i+1个数的值赋值给和值sum
if(sum>max_sum) //并判断是否为最大,是让其赋值给max_sum,并将子数组初、末位置改变。
{
max_sum=sum;
star=i;
end=i;
}
}
}
cout<<"最大子数组位置为第"<<star+1<<"个到第"<<end+1<<"个"<<endl;
cout<<"最大子数组和为"<<max_sum<<endl;
return 0;
}