结对开发—求环数组的最大子数组的和,并返回其最大子数组3
结对成员:信1201-1班 黄亚萍
信1201-1班 袁亚姣
一、题目要求
题目:返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
二、设计思路
这次的主要问题在于这次的一位数组要首尾相连,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大,所以我们采用以下方法寻找最大值,如输入 a1 a2 a3 a4这4位数,我们将其扩展为
a1 a2 a3 a4 a1 a2 a3
在第一个的基础上进行扩展,很容易得到结果,并返回最大数组
三、源代码
1 #include "stdio.h" 2 #include"stdlib.h" 3 #include"time.h" 4 #define N 1000 5 int a=0,b=0; 6 int q=0; 7 int compare( int arry1[],int length) 8 { 9 int max[N],max1,i,j,q; 10 int fmax=max[0]; 11 int arr[N]; 12 13 for(j=0;j<length;j++) 14 { 15 int sum=0; 16 17 max1=-9876; 18 for(i=j;i<j+length;i++) 19 { 20 sum=sum+arry1[i]; 21 if(sum>=max1) 22 { 23 max1=sum; 24 q=i; 25 } 26 } 27 max[j]=max1; 28 arr[j]=q; 29 printf("包含数组中第%d个数的所有子数组中和最大的值为:%d\n",j+1,max[j]); 30 if(max[j]>fmax) 31 { 32 fmax=max[j]; 33 a=j; 34 b=arr[j]; 35 } 36 } 37 printf("所有子数组的和的最大值为:%d\n",fmax); 38 for(i=a;i<b+1;i++) 39 { 40 printf("%d ",arry1[i]); 41 } 42 printf("\n"); 43 return 0; 44 } 45 int main(int argc, char* argv[]) 46 { 47 int arry[N],arry1[N]; 48 int length; 49 srand(time(NULL)); 50 printf("请输入要比较整数的个数:"); 51 scanf("%d",&length); 52 printf("请输入整数:"); 53 for(int i=0;i<length;i++) 54 { 55 scanf("%d",&arry[i]); 56 57 } 58 for( i=0;i<2*length-1;i++) 59 { 60 if(i<length) 61 { 62 arry1[i]=arry[i]; 63 } 64 else 65 { 66 arry1[i]=arry[i-length]; 67 } 68 printf("%d ",arry1[i]); 69 } 70 printf("\n"); 71 compare(arry1,length); 72 return 0; 73 }
四、运行结果截图
五、总结与心得
通过这几次团队合作的实验中,我真正的认识到团队合作的重要性,它能够帮助我们认识到自己思维的不足与片面性,比如说,在本次实验中,求环形数组的最大子数组的和,我们通过转化,把它等价于一个展开的一维数字来进行运算,这是我们一起商讨的结果,但是同时,也有我们忽略的,也是我们的不足之处,当环形数组的元素个数的和大于0,那么环形数组的子数组是n次循环的结果的话,那最后的子数组的和的最大值对应的子数组的元素个数是无穷个。