这次测试要求能从一个整形数组中求出所有子数组的和的最大值,并且要求时间复杂度为O(n)。其实能解决这个问题的方案有很多种,有的简单、有的麻烦,有的时间复杂度高,有的时间复杂度低。在课上的时候,有很多同学都上前介绍了自己的方案,写出来的方法也各不相同,但无非就是简单一些或者麻烦一些。而我的想法是从第一个数开始,把每一个子数组的和都求出来,然后做比较,但这种方法时间复杂度为O(n2),并且大部分同学用的都是这种方法。
之后我上网查询了一种方法,时间复杂度为O(n),并且代码非常简洁,他的想法就是先将最大值付给第一个数,然后找到第一个非负的整数开始往后加,每次相加都记录一下最大值,只要比上一次相加的结果大就刷新最大值的结果,从而找到子数组的和的最大值。代码如下:
1 package 数组; 2 3 import java.util.Scanner; 4 5 public class shuzu { 6 static Scanner in=new Scanner(System.in); 7 public static void main (String[] args){ 8 int num[]=new int[200]; 9 System.out.println("请输入数组个数"); 10 int n; 11 n=in.nextInt(); 12 System.out.println("请输入数组"); 13 for(int i=0;i<n;i++) { 14 num[i]=in.nextInt(); 15 } 16 int max=0; 17 int max2=0; 18 max2=num[0]; 19 for(int i=0;i<n;i++) { 20 if(max<=0) { 21 max=num[i]; 22 }else { 23 max+=num[i]; 24 } 25 if(max2<max) { 26 max2=max; 27 } 28 } 29 System.out.println(max2); 30 } 31 }