一、题目与要求
题目:
返回一个整数数组中最大子数组的和
要求:
1.输入一个整形数组,数组里有正数也有负数。
2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3.求所有子数组的和的最大值。要求时间复杂度为O(n)。
结对编程要求:
1.两人结对完成编程任务。
2.一人主要负责程序分析,代码编程。
3.一人负责代码复审和代码测试计划。
4.发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。(截止到周四3月19日24:00)
二、设计思想
初看程序感觉不是很难,但是由于题目中要求的时间复杂度为o(n),在满足这一条件的基础上解决该问题存在一定的难度,利用普通的遍历求最大子数组的方法在这里已经不在试用,所以就必须寻找一种查找算法可以实现时间复杂度为o(n)。
三、源代码
1 /*====================================================================== 2 # Author: ZhangYaPeng 3 # E-Mail: [email protected] 4 # Last modified: 2015-03-17 20:23 5 # Filename: Demo.cpp 6 # Description: count the max sum of the sub Array. 7 ======================================================================*/ 8 # include <iostream> 9 #define LENGTH 5 //定义出数组的长度 10 using namespace std; 11 12 //求两个数字的最大值 13 int Max(int a,int b,int c) 14 { 15 int temp = a>b?a:b; 16 int max = temp>c?temp:c; 17 return max; 18 } 19 20 //求最大子数组的和 21 int SelectMaxArr(int arr[],int left,int right) 22 { 23 if(left == right) //嵌套结束条件 24 { 25 if(arr[left] > 0) 26 return arr[left]; 27 else 28 return 0; 29 } 30 int maxMidLeft,maxMidRight; //存放包含中点的左右部分的最大值 31 int TempLeft,TempRight; //存放中点左右部分的最大值 32 int maxLeft,maxRight; //存放最终该嵌套层中左右部分的最大子数组的和 33 int mid; //存放每次嵌套的中点 34 mid = (left+right)/2; 35 maxMidLeft = 0; 36 maxMidRight = 0; 37 TempLeft = 0; 38 TempRight = 0; 39 for(int i = mid;i >= left;i--) //从中点作为边界开始求其两边最大的子数组并依次递归(左侧部分) 40 { 41 TempLeft += arr[i]; 42 if(maxMidLeft < TempLeft) 43 { 44 maxMidLeft = TempLeft; 45 } 46 } 47 for(int i=mid+1;i<=right;i++) //从中点作为边界开始求其两边最大的子数组并依次递归(右侧部分) 48 { 49 TempRight += arr[i]; 50 if(maxMidRight < TempRight) 51 { 52 maxMidRight = TempRight; 53 } 54 } 55 //递归计算左右两部分的最大子数组的和 56 maxLeft = SelectMaxArr(arr,left,mid); 57 maxRight = SelectMaxArr(arr,mid+1,right); 58 return Max(maxLeft,maxRight,maxMidLeft+maxMidRight); 59 } 60 61 //测试函数 62 int main() 63 { 64 int Arr[LENGTH]; 65 int max; //存放最大子数组的和 66 cout<<"请输入"<<LENGTH<<"个整数(可正可负):"; 67 for(int i=0;i<LENGTH;i++) 68 { 69 cin>>Arr[i]; 70 } 71 max = SelectMaxArr(Arr,0,LENGTH-1); 72 cout<<"该数组中最大子数组的和为:"<<max<<endl; 73 return 0; 74 }
四、运行结果
五、结果测试
1.数组元素均为有序正数
2.数组元素均为乱序正数
3.数组元素均为有序负数
4.数组元素为乱序负数
5.数组元素为正负混合
六、结果测试
在本次结对开发中,我和田永涛同学刚开始各自阐明了自己对个题目的看法,每个人的想法肯定不完全相同,所以我们积极讨论寻找最优的解决办法,若该题目不考虑时间复杂度为o(n)的对可以通过基层嵌套来实现,思路上并不复杂,之所以难解决就是因为对一些快速高效的查找算法了解不充分的原因。
在编写代码的时候,我们分工明确,我代码编写田永涛负责代码的错误提示以及相关的优化,这样写代码效率可能并没有很明显的提升,但是代码中的一些编写规范会实现的很好,之所以效率不高也可能是因为第一次尝试这种结对开发的模式,相信在以后这种练习的次数多了之后,效率上会有较为明显的提升。