设计思想:
首先定义int型number,maxsum,maxstart;number为输入的数组长度,maxsum为最大子数组,maxstart为开始位置值,刚开始时最大子数组maxsum和开始位置值maxstart都是数组第一个元素,然后判断开始位置的值,如果maxstart小于0,则另maxstart等于0,然后maxstart在自身基础上加上下一个数组元素,再判断maxstart与maxsum的大小,若maxstart大于maxsum,则maxsum的值为maxstart,maxstart的值不变;以此递归,直至数组最后一个元素,最后maxsum的值就是这个数组中最大子数组的和。
出现的问题:
1.换用了判断开始位置的值,正的则子数组和最大值再加上下一个数组元素,负的则子数组和最大值变成下一个数组元素的值。
2.刚开始将两个for循环嵌套来得到的值不正确。
可能的解决方案:
上网查阅资料
源代码:
import java.util.Scanner; public class Shuzu { public static void main(String[] args){ int number,maxsum,maxstart; int i; 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<number;i++) { if(maxstart<0) { maxstart=0; } maxstart+=array[i]; if(maxstart>maxsum) maxsum=maxstart; } System.out.println(maxsum); in.close(); } }
结果截图:
总结:
在考虑这个问题时,需要从一开始的元素考虑,然后逐步扩展,此题运用循环递归就可以解决。当自己不懂的知识要上网查阅,网上有很多解答。