题目:返回一个整数数组中最大子数组的和。
要求:
1.要求程序必须能处理1000 个元素;
2.每个元素是int32 类型的,出现子数组之和大于整型表示的最大范围会出现什么情况;
3.输入一个整型数组,数组里有正数也有负数。
4.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
5.求所有子数组的和的最大值。要求时间复杂度为O(n)。
设计思想:
(1)将数组大小定义为n,用户输入p的值以确定该数组的长度,对于这n个元素用随机函数进行生成,每个元素定义为int32类型。
(2)为了满足要求3,我们将随机函数写成 a[i] = rand()%2001-1000 ,随机生成(-1000,1000)中的数。
(3)先定义一个int类型的max,值为0,以后用它来存储最大子数组的和,再定义一个int类型的b,用它来求累加和(即各个子数组的和)。当b<0时,清空b中原有元素和,继续从下一元素累加,同时将之前最大的累加和存入max更新,依次循环直到i<n时结束。而当整个数组元素均为非正整数时,找出数组中最大元素,存入max。
源代码为:
1 #include <iostream> 2 #include<stdlib.h> 3 #include<time.h> 4 using namespace std; 5 6 int main() 7 { 8 int i; 9 int n; 10 int *a; 11 int max = 0; 12 int b = 0; 13 14 cout<<"请输入数组元素个数:"<<endl; 15 cin>>n; 16 a=new int[n]; 17 srand(time(NULL)); 18 cout<<"数组为:"<<endl; 19 for (i = 0; i<n; i++) 20 { 21 a[i] = rand()%2001-1000 ; 22 } 23 for (i = 0; i<n; i++) 24 { 25 cout << a[i] << ‘\t‘; 26 } 27 cout << endl; 28 29 for (i = 0; i < n; i++) 30 { 31 b += a[i]; 32 if (b < 0) 33 b = 0; 34 if (b > max) 35 max = b; 36 } 37 if (max == 0) 38 { 39 max = a[0]; 40 for (i = 0; i < n; i++) 41 { 42 if (max < a[i]) 43 { 44 max = a[i]; 45 } 46 } 47 } 48 cout <<"最大子数组为:"<< max << endl; 49 system("pause"); 50 return 0; 51 }
结果截图:
溢出测试:
为了测试要求2的问题,我们在取数的时候对其进行了乘4294967296的操作,即将随机函数写成a[i] = rand()*4294967296 ,使数组内的元素可以越界。
结果如下:
可以看出程序有溢出时,运行结果会使每个元素显示为0,程序出错。
总结:当我们想要处理的数组元素个数太多(如1000个)时,不可避免的就会使程序的运算时间增长很多,这让我们意识到,在进行大量数据处理的时候,认真考虑所用算法的时间复杂度,从而选择相对简单的算法的重要性,不止可以提高效率,还能降低出错率。
合作美图:
(图为20163953 关甜欢和20163955 王美仪合作时照片)
原文地址:https://www.cnblogs.com/guantianhuan/p/9787059.html