返回一个整数数组最大子数组的和
开始时间:14:00
结束时间:17: 20
要求:
1,程序可以处理1000个元素;
2,每个元素是int32类型的;
3,整型数组有正数也有负数;
4,可以求出所有子数组的和的最大值,时间复杂度为O(n)
5,小组成员:于芳娜,张素颖
设计思路
1,
如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和。不过非常进憾的是,由于长度为n的数组有O(n^2)个子数组,而且求一个长度为n的数组的和的时间复杂度为O(n).
因此这种思路的时间是O(n^3).
2,
很容易理解,当我们加上一个正数时,和会增加,当我们加上一个负数时,和合减少,如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零。
不然的话这个负数将会减小接下来的和。
3,
调用随机函数rand(),srand()生成随机数组。
1 //2018.10.14 2 //组内成员:于芳娜,张素颖 3 //返回一个整数数组最大子数组的和 4 #include<iostream> 5 #include<time.h> 6 #include<stdlib.h> 7 using namespace std; 8 int MaxSum(int data[],int length,int &start,int &end) 9 { 10 int max=data[0]; 11 int starttemp=0,endtemp=0;//定义开始和结束位置 12 int cursum=0;//定义元素和 13 if(data==NULL||length<0) 14 { 15 return 0; 16 }//数组为空的处理 17 for(int i=0;i<length;i++) 18 { 19 if(cursum<=0)//数组元素和小于零时,重置为第i个元素 20 { 21 cursum=data[i]; 22 starttemp=i; 23 endtemp=i; 24 } 25 else 26 { 27 cursum+=data[i];//数组元素大于零时,累加 28 endtemp=i; 29 } 30 if(cursum>max)//当前和大于最大和,则重置最大和 31 { 32 max=cursum; 33 start=starttemp;//子数组元素开始及结束位置 34 end=endtemp; 35 } 36 } 37 return max; 38 } 39 int main() 40 { 41 int n; 42 cout << "Number of elements in array:" << endl; 43 cin >> n; 44 srand((unsigned)time(NULL));//实现不同随机数的生成 45 int data[n]; 46 { 47 for(int j=0;j<n;j++) 48 { 49 data[j]=rand()%2001-1000; 50 cout<<data[j]<<" "; 51 }//输出-1000到1000的1000个随机数 52 } 53 int length=sizeof(data)/sizeof(int);//数组长度计算 54 int start=0,end=0; 55 int result=MaxSum(data,length,start,end);//调用函数 56 cout << endl; 57 cout<<"MaxOfSubarrays="<<endl; 58 for(int i=start;i<=end;i++) 59 cout<<data[i]<<" ";//输出最大子数组 60 cout<<endl; 61 cout<<"MaxSumOfSubarrays="<<" "<<endl; 62 cout<<result<<endl;//输出最大子数组的和 63 return 0; 64 }
设计过程中遇到的问题
1,初始阶段,没有明确的设计思路可以将最大子数组的和表示出来,以至于设计出的代码仅仅只适用于一两个数组,不能做到很好的泛化。
解决方案:查阅并借鉴相关资料,完善自己的设计思路。
2,随机数的生成过程之中,不知道生成负的随机数的方法
解决方案:查阅并借鉴相关资料,扩大了生成随机数的范围。
3,代码写完之后存在多处运行错误
解决方案:逐一调试。
运行截图
对于子数组之和大于整型表示的最大范围时出现情况的观察
把生成随机数的位数放大至1*10^20---2*10^20,会出现以下情况:
总结
这是第一次由两个人共同完成一个编程,在编程过程之中分工明确,共同解决一些技术上的难题,体会到对各种函数的使用和编写还不是特别熟练,容易出现卡壳现象,
今后会多读一些程序代码,提高自己的编程能力。
小组成员合照