求最大子数组之和
Posted tansong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求最大子数组之和相关的知识,希望对你有一定的参考价值。
要求:
要求程序必须能处理1000个元素;
每个元素是int32类型的,出现子数组之和大于整型表示的最大范围会出现什么情况;
输入一个整形数组,数组里有整数也有负数;
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;
求所有子数组的和的最大值,要求时间复杂度为O(n)。
第一段处理1000个元素:
1 #include<iostream> 2 #include<stdlib.h> 3 #include<time.h> 4 using namespace std; 5 int main() 6 { 7 int n,star=0,end=0; //n表示整型数组长度,star表示最大子数组起始位,end表示最大子数组终止位 8 cout<<"输入整型数组的长度:"; 9 cin>>n; 10 int *p=new int[n]; 11 srand((unsigned)time(NULL)); 12 for(int i=0;i<n;i++) 13 { 14 p[i]=rand()%2000-1000; //随机取-1000~1000中的整数 15 } 16 for(int i=0;i<n;i++) 17 { 18 cout<<p[i]<<" "; //输出这1000个元素 19 if((i+1)%10==0) //每十个换行 20 { 21 cout<<endl; 22 } 23 } 24 int sum=p[0]; //子数组 25 int max_sum=p[0]; //最大子数组 26 for(int i=1;i<n;i++) 27 { 28 if(sum>0) //从第二个数开始判断是否为正数 29 { 30 if(p[i]>(INT_MAX-sum)) //加入了一段判断int类型数据是否溢出。 31 { 32 cout<<"int类型溢出"<<endl; 33 return 0; 34 } 35 sum=sum+p[i]; //是正数,将和值(初始值为p【0】)和第i+1个数做和。 36 if(sum>max_sum) // 并判断是否为最大,是让其赋值给max_sum,并将子数组末位置改变。 37 { 38 max_sum=sum; 39 end=i; 40 } 41 } 42 else 43 { 44 sum=p[i]; //是负数,将第i+1个数的值赋值给和值sum 45 if(sum>max_sum) //并判断是否为最大,是让其赋值给max_sum,并将子数组初、末位置改变。 46 { 47 max_sum=sum; 48 star=i; 49 end=i; 50 } 51 } 52 } 53 cout<<"最大子数组位置为第"<<star+1<<"个到第"<<end+1<<"个"<<endl; 54 cout<<"最大子数组和为"<<max_sum<<endl; 55 return 0; 56 }
第二段溢出情况:
1 #include<iostream> 2 #include<stdlib.h> 3 #include<time.h> 4 using namespace std; 5 int main() 6 { 7 int n,star=0,end=0; //n表示整型数组长度,star表示最大子数组起始位,end表示最大子数组终止位 8 cout<<"输入整型数组的长度:"; 9 cin>>n; 10 int *p=new int[n]; 11 srand((unsigned)time(NULL)); 12 for(int i=0;i<n;i++) 13 { 14 p[i]=rand()%2000-1000; //随机取-1000~1000中的整数 15 p[i]=p[i]*1000000; //把随机数扩大10^6倍 16 } 17 for(int i=0;i<n;i++) 18 { 19 cout<<p[i]<<" "; //输出这1000个元素 20 if((i+1)%10==0) //每十个换行 21 { 22 cout<<endl; 23 } 24 } 25 int sum=p[0]; //子数组 26 int max_sum=p[0]; //最大子数组 27 for(int i=1;i<n;i++) 28 { 29 if(sum>0) //从第二个数开始判断是否为正数 30 { 31 if(p[i]>(INT_MAX-sum)) //加入了一段判断int类型数据是否溢出。 32 { 33 cout<<"int类型溢出"<<endl; 34 return 0; 35 } 36 sum=sum+p[i]; //是正数,将和值(初始值为p【0】)和第i+1个数做和。 37 if(sum>max_sum) // 并判断是否为最大,是让其赋值给max_sum,并将子数组末位置改变。 38 { 39 max_sum=sum; 40 end=i; 41 } 42 } 43 else 44 { 45 sum=p[i]; //是负数,将第i+1个数的值赋值给和值sum 46 if(sum>max_sum) //并判断是否为最大,是让其赋值给max_sum,并将子数组初、末位置改变。 47 { 48 max_sum=sum; 49 star=i; 50 end=i; 51 } 52 } 53 } 54 cout<<"最大子数组位置为第"<<star+1<<"个到第"<<end+1<<"个"<<endl; 55 cout<<"最大子数组和为"<<max_sum<<endl; 56 return 0; 57 }
结果只复制了结果,看到了提出int类型溢出。
总结:主要操作方法是借鉴别人的,然后两人一起在宿舍调试,最后出来结果。预计4个小时,实际上花了大概5个小时。
以上是关于求最大子数组之和的主要内容,如果未能解决你的问题,请参考以下文章