返回一个数组中的最大字数组的和
返回一个数组中的最大字数组的和
负责人:赵顺杰,马帅强
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有字数组的和的最大值,要求时间复杂度为O(n)。
结对编程要求:
两人结对完成变编程任务。
一人主要负责程序分析,编写代码。
一人负责代码复审和代码测试计划。
在王老师布置任务后,赵顺杰和我决定先讨论一套编程方案,然后再实行代码编写,一共讨论了两套计划:
第一种:设置数组为a[5],从第一个元素起,把累加的和赋值给max,如果后一个元素加入后max变大,就继续累加下去,如果变小,则舍弃前面已经累加的所有元素,从当前元素开始再赋值给max。结果是方案失败,原因是可能在最后的max值没有前面的子数组的和大,忽略掉了前面已经舍弃的元素。
第二种:按照个数进行子数组的分配。比如数组为a[5],首先让子数组的元素个数是5,加上所有元素的和赋值给新定义的数组b[0];然后让子数组的元素的个数为4,有两种情况,前面四个或者后面四个,然后让它们的和赋值给b[1],b[2];然后让子数组的元素的个数为3,这样就有三种情况......以此类推,最后把所有得到的字数组的和全部放到b的数组里。再进行排序,输出最大值。讨论的结果是失败,因为要用到很多次的循环,循环的嵌套造成了时间复杂度的增加。
在周三的上午,我们通过互相讨论以及和其他的分组交换意见,得到了一个求出最大值的解决方案:设置了加数和sum,变量t,初始值都为0,将元素进行循环,当t<0时,将元素值赋给t,否则就t=t+sum,如果sum<t时,sum=t,最后返回到sum,在主函数中点用函数输出即可。
下面的两个图分别是方案一和方案二,最后的代码是最终的方案:
#include<iostream.h> #define N 10 int max(int a[N]) { int sum=0,t=0; int i; for(i=0;i<N;i++) { if(t<0) t=a[i]; else t=t+a[i]; if(sum<t) sum=t; } return sum; } void main() { int a[N]={2,-3,25,-20,13,-5,-18,20,-7,-12}; cout<<"最大子数组的和是:"<<max(a)<<endl; }