设计思想:
1.首先设数组中的第一个数为最大值,循环从0开始,和相邻的数相加;
2.若得到的和大于最大值,则将和的值赋给最大值;
3.若得到的和小于0,则将和赋为0,相当于从下一个数开始下一次循环;若最大值小于当前值,则将当前值赋给最大值,以保证全为负数时的正确。
出现的问题:
最后求得的最大值没有计算负数,如 5 -1 3,得到的是8;
解决方案:
令数组第一个数为最大值,循环从0开始,即可解决问题。
源代码:
import java.util.Scanner; public class Test2 { public static void main(String[] args){ int N=5; int list[]=new int [N]; //创建一个新数组 Scanner in=new Scanner(System.in); int i; System.out.println("请输入数组:"); for(i=0;i<N;i++) { list[i]=in.nextInt(); } max_ l=new max_(); System.out.print("子数组最大的和为: "+l.max_(list,N)); //调用函数 in.close(); } } class max_ { int max_(int list[],int length) { int i; int lmax=0; int max=list[0]; //设最大值为list[0] for(i=0;i<length;i++) { lmax+=list[i]; if(lmax>max||lmax==max) { max=lmax; } if(lmax<0)//若小于0,则从后一个数开始加和 { lmax=0; if(max<list[i]||max==list[i]) { max=list[i]; } } //若数组全为负数,求最大值 } return max; } }
结果截图:
总结:
求子数组的和的最大值,首先要理解清楚子数组的概念;只能是相邻数之间组成。逻辑要更清楚一些,我添加了只有负数时的情况。