连续子数组的最大和

第一种方法:

此种方法的思想较为简单:先找出从第1个元素开始的最大子数组,而后再从第2个元素开始找出

从第2个元素开始的最大子数组,依次类推,比较得出最大的子数组。

 1 import java.util.Scanner;
 2 public class Main{
 3     public static void main(String[] args){
 4         Scanner in = new Scanner(System.in);    
 5         int num = in.nextInt();
 6         int arr[] = new int[num];
 7         for(int i=0;i<num;i++){
 8             arr[i] = in.nextInt();
 9         }
10         int maxsum = arr[0];
11         for(int i=0;i<num;i++){
12             int currsum = 0;
13             for(int j=i;j<num;j++){
14                 currsum += arr[j];
15                 if(currsum>maxsum){
16                     maxsum = currsum;
17                 }
18             }
19         }
20         System.out.println(maxsum);
21     }
22 }

此种方法的时间复杂度为O(n*n),在OJ上运行时会显示:没有在规定的时间内运行完成。即说明,没有通过,太低级了!!哈哈

 

第二种方法:

分两种情况  a)当数组中所有元素都是负数是,此问题变成了找数组的最大值;b)当数组中的元素不全为负数时,和最大子数组的第一个元素一定是正数,且子数组的和一定大于0,

 1 import java.util.Scanner;
 2 public class Main{
 3     public static void main(String[] args){
 4         Scanner in  = new Scanner(System.in);
 5         int num = in.nextInt();
 6         int arr[]  = new int[num];
 7         boolean flag = true;
 8         for(int i=0;i<num;i++){
 9             arr[i] = in.nextInt();
10         }
11         for(int i=0;i<num;i++){
12             if(arr[i]>=0){
13                 flag = false;    //arr[]存在大于或等于0的数
14             }
15         }
16         int i,j;  
17         int MaxSum = 0;  
18         int CurSum = 0;
19         if(flag == false){    
20               
21             for(i=0;i<num;i++)  
22             {  
23                 CurSum += arr[i];  
24                 if(CurSum > MaxSum)  
25                     MaxSum = CurSum;  
26                 if(CurSum < 0)  
27                     CurSum = 0;  
28             }  
29             System.out.println(MaxSum);
30         }
31         if(flag == true){    //arr[]中的元素全部小于0
32             MaxSum = arr[0];
33             for(j=0;j<num;j++){
34                 if(arr[j]>MaxSum){
35                     MaxSum = arr[j];
36                 }
37             }
38             System.out.println(MaxSum);
39         }
40     }
41 }

 

posted @ 2017-08-10 18:46  XuGuobao  阅读(237)  评论(0编辑  收藏  举报