数组

  这次测试要求能从一个整形数组中求出所有子数组的和的最大值,并且要求时间复杂度为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 }

  

原文地址:https://www.cnblogs.com/yuanxiaochou/p/10506870.html