结对人员:张世通 梁世豪
一、题目
- 返回一维数组中最大子数组的和
- 输入一个整形数组,数组里有正数也有负数。
- 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
- 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
- 同时返回最大子数组的位置。
- 求所有子数组的和的最大值。
- 要求时间复杂度为O(n)
二、设计思路
1、在上一次求一维数组最大子数组的问题上,进行拓展,继续使用类似的求和方法
2、通过定义变量start,finish确定最大子数组的起始位置和终止位置
3、每次将所有与数组元素A[i]有关的子数组求出后,将A[i]的值付给A[length+i];
4、循环到最后一个数组元素A[length-1]时终止,即可遍历完所有数组元素
三、代码
1 // ketang6.cpp : 定义控制台应用程序的入口点。 2 // 3 #include"stdafx.h" 4 #include "iostream" 5 using namespace std; 6 7 /*确定求和存储数组元素*/ 8 void Son(int Arr[],int length,int start,int finish) 9 { 10 int max=Arr[0]; 11 int add=0;//定义求和变量 12 for(int i=0;i<length;i++) 13 { 14 add=0; 15 for(int j=i;j<length+i;j++) 16 { 17 add=add+Arr[j]; 18 if(add>max) 19 { 20 max=add; 21 start=i; 22 finish=j; 23 } 24 } 25 Arr[length+i]=Arr[i]; //每次将已经计算过的数放到最后 26 } 27 if(finish>=length) 28 { 29 cout<<"最大子数组起始位置为:"<<start+1<<endl; 30 cout<<"最大子数组终止位置为:"<<finish-length+1<<endl; 31 } 32 else 33 { 34 cout<<"最大子数组起始位置为:"<<start+1<<endl; 35 cout<<"最大子数组终止位置为:"<<finish+1<<endl; 36 } 37 cout<<"最大子数组为:"<<endl; 38 for(int m=start;m<=finish;m++) 39 { 40 cout<<Arr[m]<<" "; 41 } 42 cout<<endl; 43 cout<<"最大子数组的和为:"<<endl; 44 cout<<max<<endl; 45 } 46 47 /*主函数*/ 48 int main() 49 { 50 int num,length,start,finish;//定义原始数组长度length,求和存储数组长度num 51 start=0; 52 finish=0; 53 cout<<"请输入数组元素个数:"; 54 cin>>length; 55 num=2*length; 56 int* Arr=new int[num];//定义原始数组 57 cout<<"请输入数组数据"<<endl; 58 for(int i=0;i<length;i++) 59 { 60 cin>>Arr[i]; 61 } 62 cout<<endl; 63 Son(Arr,length,start,finish); 64 delete []Arr; 65 return 0; 66 }
四、运行结果
五、总结收获
还是延续了第一次实验的主要想法,但因为一开始我们的代码没有实现求出位置,这次是新加的,就是时间复杂度没有达到题目的要求。和世通合作讨论的过程很愉快,我也很喜欢这种很有感觉的交流。老师说得对,我们在和别人合作编写软件的过程中应该多一些面对面的交流。
通过这么几次的软工作业,我越发觉得应该多学学怎么和别人合作,自己这方面很需要锻炼,以前一个人觉得还挺好,现在发现有人一起搭伙效率比自己用两倍时间做的事情还多,效率真的提高了很多!
六、合影