结对开发
结队小组成员:信1201-1班 燕亚峰
信1201-1班 王童博
一、题目与要求
返回一个整数数组中最大子数组的和
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
二、设计思路
题目要求是要返回一个整数数组中最大子数组的和,经过和童博商量觉得这道题目可以用以下思路:数组个数可以自己定义,若数组全为负数,则直接比较单个数,求出最大值。输出即可。若有正有负或全为正数则求出相邻正数或相邻负数的和形成正负交替的新数组。则从正数开始即a[0]或a[1]开始。假如从a[0]开始。若a[0]+a[1]〉=0则将a[2]=a[0]+a[1]+a[2]。同时a[0]存入数组b中,若a[0]+a[1]<0,则将a[0]存入数组b中,然后继续a[2]+a[3]〉=0比较。以此循环。直至结束。
三、源代码
#include<iostream.h> int main() { int N; cout<<"输入数组个数:"; cin>>N; int a[20]; //原数组 int b[20]; //正负交替数组 int c[20]; //最终比较数组 int i; int M; //存放数组b的长度 int j=0; int max; //存放最大值 int p=0; int sum; //相邻正数和 int sum1; //相邻负数和 sum=0; sum1=0; int u=0; //输入数组 for(i=0;i<N;i++) { cout<<"输入第"<<i+1<<"个数:"; cin>>a[i]; } //判断数组是否全负 for(i=0;i<N;i++) { if(a[i]>=0) { u=1; } } if(u==1) { //求出相邻正数或相邻负数的和,形成正负交替数组 for(i=0;i<N;i++) { if(a[i]>=0) { if(i<N-1) { if(a[i+1]>=0) { sum=sum+a[i]; } else { b[j++]=sum+a[i]; sum=0; } } else { if(a[i-1]>=0) { b[j++]=sum+a[N-1]; } else { b[j++]=a[N-1]; } } } else if(a[i]<0) { if(i<N-1) { if(a[i+1]<0) { sum1=sum1+a[i]; } else { b[j++]=sum1+a[i]; sum1=0; } } else { if(a[i-1]<0) { b[j++]=sum1+a[N-1]; } else { b[j++]=a[N-1]; } } } } M=j; if(b[0]<0) { j=1; } else { j=0; } //对数组B进行操作,将利用算法求的机最大值存入数组c中 for(int y=j;y<M;y=y+2) { if(y+2<M) { if(b[y]+b[y+1]>=0) { c[p++]=b[y]; b[y+2]=b[y+2]+b[y+1]+b[y]; if((y+2==M-1)||(y+2==M-2)) { c[p++]=b[y+2]; break; } } else { c[p++]=b[y]; } } else { c[p++]=b[y]; } } //对数组c求最大值 max=c[0]; for(i=0;i<p;i++) { if(c[i]>=max) { max=c[i]; } } cout<<endl; cout<<"最大值max为:"; cout<<max<<endl; } else { max=a[0]; for(i=0;i<N;i++) { if(a[i]>=max) { max=a[i]; } } cout<<"最大值max为:"; cout<<max<<endl; } return 0; }
四、运行截图
五、实验总结
开始我们两个想法不太一样,我们分别阐述了自己的想法,经过思考,我们结合了我们想法中的优点,摒弃了缺点。过程中我提醒他数组边界等问题。
我们同感觉这程序缺点就是没有模块化,像应该写成函数形式的没有写成。导致程序不系统化,这是我们应该改进的。结对开发明显和自己单独编程是不一样的。我们必须充分沟通,分配好各自的任务,并相互督促,相互帮助共同完成。
六、合照