一.设计思想
1.在原先的基础上考虑连接处的问题,我考虑的是可以把之前循环次数加上数组长度成为新的循环上限。例如之前循环从下标1开始,n(数组长度)结束,循环体执行n-1次,改为循环从下标1开始,2n-1处结束,循环体执行2n-2次。
2.数组长度不变,增加一个控制变量j(数组下标),初值为1,开始位置值maxstart每往前加上一个元素,j都自加一,当j加到n(数组长度)时,j重新赋值为0。
3.循环体执行2n-2次后,即可得出最大子数组的和。
二.源代码
import java.util.Scanner; public class ArrayMax { public static void main(String[] args){ int number,maxsum,maxstart; int i,j=1; Scanner in = new Scanner(System.in); System.out.println("请输入数组的大小:"); number=in.nextInt(); int array[]=new int[number]; System.out.println("请输入数组的值:"); for(i=0;i<number;i++) { array[i]=in.nextInt(); } maxsum=array[0]; maxstart=array[0]; for(i=1;i<2*number-1;i++) { if(maxstart<0) { maxstart=0; } maxstart+=array[j]; j++; if(maxstart>maxsum) maxsum=maxstart; if(j==number) j=0; } System.out.println("最大子数组和:"+maxsum); in.close(); } }
三.结果截图
四.总结
循环数组求最大子数组和只需要在之前的基础上考虑数组最后一个元素和第一个元素的过渡问题,循环控制总的次数,不能再用循环来控制数组的下标,需要再另设一个控制变量来控制数组下标,在下标加到成数组最后一个时,控制变量变为数组第一个元素的下标。
五.合作过程
1.我们先交流了一下对方的想法,讨论一下彼此的优缺点,然后我们开始自己先实现自己的程序,彼此复查对方的程序功能,找出对方存在的bug。
2.工作照: