题目:返回一个整数数组中最大子数组的和。
要求: 输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
结对编程要求: 两人结对完成编程任务。 一人主要负责程序分析,代码编程。
一人负责代码复审和代码测试计划。
发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。
结对开发过程:
在得知题目之后,我和我的搭档@天使LR恶魔开始了认真的讨论,最终思路是定义两个整数b和sum。在一串数组中正数和负数互相穿插,正数被负数隔开。x、y表示个数大于或等于零的数组,x表示正数数组,y表示负数数组。(x1,y1,x2,y2,…)是输入的n个元素的数组。b1=sum(x1)>0,sum=b;若b2=sum(x1)+sum(y1)>0,b3=sum(x1)+sum(y1)+sum(x2),b3可能大于b1,于是sum=b3,;可能等于b1,sum不变即可;可能小于b1,sum不变…。以此类推,我们做出了如下的代码。
程序代码:
1 #include <iostream.h> 2 3 int maxSum(int* a, int n) 4 { 5 int sum=a[0]; // 将数组第一个数先赋给总和sum 6 7 int b=0; 8 9 for(int i=0; i<n; i++) 10 { 11 12 if(b<0) 13 b=a[i]; 14 else 15 b+=a[i]; 16 if(sum<b) 17 sum=b; 18 } 19 return sum; 20 } 21 22 int main() 23 { int n; 24 cout<<"请输入数组的元素个数: "<<endl; 25 cin>>n; 26 cout<<"请输入数组的元素: "<<endl; 27 int *a=new int[n]; 28 for(int i=0;i<n;i++) 29 {cin>>a[i];} //输入n个元素的数组 30 31 cout<<maxSum(a,8)<<endl; //调用函数maxSum 32 return 0; 33 }
程序结果及测试:
1、n=5时,全为负数,第一个最大:
2、n=5时,全为负数,第五个最大:
3、n=5时,全为正数:
4、n=5时,正数、负数无序:
结对开发感想:
在此次的编程之中,让我充分的了解了结对开发程序所带来的好处。首先,结对开发不是小组开发,没有“滥竽充数”,比一个人编程更有效果,他能让两个人之间更加亲密;其次,它能让我们两个人之间互相学习互相促进,能相互学习对方的优点长处;最后我要说的是我们俩智力有限,代码仍能继续改进。
附美照一张: