设计思想:
1.定义两个数s,max用来更新子数组的最大值,从数组data[]的data[n-1]开始进行求和比较。
2利用for循环,依次判断前几项之和是否小于0,若小于0则从该项继续寻找最大值,并与前几项的最大值进行比较。选出最大值。
遇到的问题:
开始编程思路是先进行由大到小排序,在进行前几位正数相加求最大值,但是时间复杂度为(n^2)不符合要求。
直接进行编写思路不清晰。
解决方案:
在纸上进行演算,找出求子数组最大值。
import java.util.Scanner; public class main{ static int sum(int data[], int n)//定义数组和数组长度 { int s = data[n-1];//s用来更新子数组最大值 int max = data[n-1];//a表示最大值 for(int i=n-2;i>=0;i--)//逆序进行 { if(s<0)//前几项的和为负数,重新计算 { s=0; } s=s+data[i]; if(s>max) { max=s;//将最大值赋值给a } } return max; } public static void main(String[] args) { // TODO Auto-generated method stub Scanner in=new Scanner(System.in); System.out.println("请输入数组长度:"); int n=in.nextInt(); int array[]=new int[n]; System.out.println("请输入"+n+"个整数:"); for(int i=0;i<n;i++) { array[i]=in.nextInt(); } int result=sum(array,n); System.out.print("子数组的最大值为:"+result); } }
结果截图:
总结:
在编写该程序时应该思路清楚。 求子数组的和的最大值,首先要理解清楚子数组的概念,只能是相邻数之间组成。