一、题目:返回一个整数数组中最大子数组的和。
二、要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。 要求时间复杂度为O(n)。
三、设计思想
在上次试验的基础上,利用动态数组,为了满足首尾相连,所以在计算一次之后,
要把该数放在数组的最后边,这样循环遍历,最后求得最大数组之和及他们所在的位置。
四、源代码
1 #include <iostream.h> 2 void Arr_Maxsum(int arr[],int length,int first,int last) 3 { 4 int count=0; 5 int result=arr[0]; 6 int sum=arr[0];//初始化 7 for(int i=0;i<length;i++) 8 { 9 sum=0; 10 for(int j=i;j<length+i;j++) 11 { 12 sum+=arr[j]; 13 if(sum>result) 14 { 15 result=sum; 16 first=i; 17 last=j; 18 } 19 } 20 arr[length+i]=arr[i]; 21 } 22 if(last>=length) 23 { 24 cout<<"最大子数组起始位置为:"<<first+1<<endl; 25 cout<<"最大子数组终止位置为:"<<last-length+1<<endl; 26 } 27 else 28 { 29 cout<<"最大子数组起始位置为:"<<first+1<<endl; 30 cout<<"最大子数组终止位置为:"<<last+1<<endl; 31 } 32 cout<<"最大子数组为:"<<endl; 33 for(int m=first;m<=last;m++) 34 { 35 cout<<arr[m]<<" "; 36 } 37 cout<<endl; 38 cout<<"最大子数组的和为:"<<endl; 39 cout<<result<<endl; 40 } 41 int main() 42 { 43 int num,length,first,last; 44 first=0; 45 last=0; 46 cout<<"请输入数组元素个数:"; 47 cin>>length;//数组长度 48 num=2*length; 49 int* arr=new int[num]; 50 cout<<"请输入数组数据:"<<endl; 51 for(int i=0;i<length;i++) 52 { 53 cin>>arr[i]; 54 } 55 cout<<endl; 56 Arr_Maxsum(arr,length,first,last); 57 delete []arr; 58 return 0; 59 }
五、运行结果截图
六、实验总结
本次试验刚开始的时候我们俩的设计思路还不太明确,想用链表实现,但链表的知识还都不太会,
经过一番讨论与思考决定还是利用上次的动态数组完成实现。在编程过程中的一些细节知识还把握的不好,
程序修改了很多次才能运行,我们俩都收获了宝贵的经验。
七、合作照片