队友:迟真真
这次软件工程课堂上,建民老师又让我们结对编程(其实,还挺好玩的,虽然自己编程不怎滴,不过这种教学方法真的很好呢!),进入主题......
题目如下:求一个整型数组的最大子数组的和
一拿到题目,真真和我就开始吧嗒吧嗒地讨论,好像没有头绪,你一言我一语思路就来了:
思路1:
定义一个max,定义一个整数元素数组。先求出相邻元素为一个元素时的最大值赋给max;
再相邻元素为2个元素时的最大值赋给max;
相邻元素为3个元素时的最大值赋给max;
相邻元素为4个元素时的最大值赋给max;
。。。
课上并没有调试出结果,课下调试正确。
代码:
1 #include<stdio.h> 2 #define M 100 3 void main() 4 { 5 int a[M]; 6 int i,j,N; 7 int m=0,max=0; 8 int n; 9 printf("输入数组个数 "); 10 scanf("%d",&n); 11 N=n-1; 12 printf("输入数组元素 "); 13 for(i=0;i<n;i++) 14 scanf("%d",&a[i]); 15 for(i=0;i<n;i++) //比较一个元素时的最大值 16 { 17 if(a[i]>max) 18 { 19 max=a[i]; 20 } 21 } 22 23 while(N>0) //比较相邻2,3。。n个相邻元素时的最大值 24 { 25 for(i=0;i<N;i++) 26 { 27 m=0; 28 for(j=0;j<=(n-N);j++) //计算相邻的(n-N+1)的和,赋给m 29 { 30 m=m+a[i+j]; 31 } 32 if(m>max) 33 { 34 max=m; 35 } 36 } 37 N--; 38 } 39 printf("最大为:%d ",max); 40 41 42 }
还有一种算法,思路大致相同:
思路2:
a[0]
a[0]+a[1]
a[0]+a[1]+a[2]
……
a[0]+a[1]+a[2]+……a[n-1]
a[1]
a[1]+a[2]
a[1]+a[2]+a[3]
………
a[1]+ a[2]+a[3]+……..a[n-1]
a[2]
a[2]+a[3]
a[2]+a[3]+a[4]
………..
a[2]+a[3]+a[4]+……a[n-1]
………..
以此类推:
a[i]
a[i]+a[i+1]
…….
a[i]+a[i+1]………a[n-i]
因此可以找到规律,然后用3个for循环语句。
但是考虑到时间空间复杂度,这种方法貌似不太好
可以先比较出和的最大值,把这些和的最大值放在一个数组中,然后再求这个数组的最大值。
下面还有一种类似的算法,她是先把单个元素的子数组单另出来求得:
代码:
1 #include<stdio.h> 2 void main() 3 { 4 int a[100]; 5 int i,j,n; 6 int k; 7 int m=0,max; 8 printf("请输入数组元素的个数:"); 9 scanf("%d",&n); 10 printf("请输入数组元素:"); 11 for(i=0;i<n;i++) 12 scanf("%d",&a[i]); 13 14 max=a[0]; 15 for(i=0;i<n;i++) 16 { 17 18 for(j=i;j<n;j++) 19 { 20 m=0; 21 for(k=i;k<=j;k++) 22 { 23 m=m+a[k]; 24 } 25 if(m>max) 26 { 27 max=m; 28 } 29 } 30 } 31 printf("最大子数组的和为:%d ",max); 32 33 34 }
结对编程,很能锻炼合作能力,交流能力,培养和队友的默契。