先声明一下,结对开发人员是张永&吴盈盈。
又是一次战斗的课堂,先前的自己没有经过这么限时的训练,以至于我这只小菜鸟受到了致命的摧残,写个程序一头汗都出来了,悲催的,建民老师,开恩啊。不过这样的课堂多多益善吧。
方案一:
这个题目对所有的人来说都很简单了,看到这个题目很快就能够想到一种解决方案,把所有子数组的和都求出来,然后再求出和最大的那个值输出来,我和盈姐讨论的还是很激烈的,赶时间,把思想转换成代码,选择了java(我这搭档好像把java的语法忘得差不多了。。。),紧张的写了20多分钟,这种场合简直限制我的思维啊,幼小的心灵受到了暴风雨似的摧残。在建民老师一声口令下,交给了盈姐(建民老师搞的一套)。紧张的盈姐敲键盘都有点哆嗦了哈。没事,反正大家都是鸟,我们还是好鸟呢。过了一会,哎,实现了。想让老师看一下我们的结果。这个建民老师啊,竟然让我们给他看讨论的稿子,我去,想法都在脑子里呢。结果看都不看了。拉倒,先把代码贴在这:
/** * @Name: sum * @Description: 将一个整数数组的所有子数组的和存放到sumList集合中 * @Author: 张永&吴盈盈(作者) * @Version: V1.00 (版本号) * @Create Date: 2014-3-10 (创建日期) * @Parameters:int number[] * @Return: 无 */ public void sum(int number[]) { int sum=0; String indexs=""; for(int i=0;i<number.length;i++) { for(int j=0;j<number.length;j++) { for(int n=i;n<=j;n++) { sum=sum+number[n]; indexs=indexs+n;//记录子数组的索引 } SumObject sumObject=new SumObject(sum,indexs); sum=0; indexs=""; sumList.add(sumObject); } } } /** * @Name: MaxOfSum * @Description: 在集合类sumList中选出最大的那个对象 * @Author: 吴盈盈(作者) * @Version: V1.00 (版本号) * @Create Date: 2014-3-10 (创建日期) * @Parameters:无 * @Return: MaxOfSum对象 */ public SumObject MaxOfSum() { int max=0; String indexs=""; for(int i=0;i<sumList.size();i++) { if(max<sumList.get(i).getSum()) { max=sumList.get(i).getSum(); indexs=sumList.get(i).getIndexs(); } } SumObject sumObject=new SumObject(max,indexs); return sumObject; }
测试数据:1.num[]={-1,-2,3}; 结果:3 2.num[]={1,2,3}; 结果:6
方案二:
虽然第一种方法实现了,但是这道出自《编程珠玑》的题目,在这本书上给出了四个算法,老师让我们找出一个线性算法。好家伙,这可是真真的用到了数学功底啊,我都想找数学老师来探讨一下了。。。还是和队友想想吧,在网上参考了一下别人的思想,这个算法果然很好,用一个变量max记录子数组和的最大值,然后遍历数组(索引从0开始变化),再用一个可能的最大值变量max1,数组的下标每增加1: 当前的和max1和0比较,如果小于零,证明当前索引的数组是个负数而且很大,下次子数组直接从当前元素的下一项开始;如果max1的值大于max,则让max=max1;直到遍历结束,则max中存放的就是最大值。写了这么多文字,不知道有没有描述清楚,给出代码实现吧:
/** * @Name: bestSearchMaxSum * @Description: 在求子数组的最大和 * @Author: 张永&吴盈盈(作者) * @Version: V1.00 (版本号) * @Create Date: 2014-3-10 (创建日期) * @Parameters:整型数组number[],SumObject对象maxSumObject * @Return: SumObject对象 */ public SumObject bestSearchMaxSum(int number[], SumObject maxSumObject) { int i; int max=0; String indexStart=""; String indexEnd=""; for ( i = 0; i < number.length; i++ ) { if ( (max= number[i] + max) > 0 ) { indexEnd = i+""; } else { indexStart = ""+(i + 1); max = 0; } if ( max > maxSumObject.getSum() ) { maxSumObject.setSum(max); } } maxSumObject.setIndexs(indexStart+indexEnd); return maxSumObject; }
还是方案一的测试数据,结果完全正确,这次的算法,就符合老师所谓的线性算法了吧,建民老师,这次看看吧!