设计思想:

1、setArray()函数实现数组的输入 此处定义数组长度为10

2、ArrayMax()函数实现求最大子数组的和。应为复杂度为O(n),首先 输入一个数组 如:

 -1 2 -1 -2 5 4 3 -6 8 9 

先定义一个新的数组cArray[],长度为11.然后初始化cArray[1]为0;for循环中 有

cArray[i+1] = cArray[i]+array[i];

所以新的数组为 :

0 -1 2 1 -1...

因为求最大值,所以判断当cArray[]小于0时,将5 赋值给新数组

即为:

0 -1 2 1 -1 5 9 12 6...

最后在得到的新数组中求出最大的值 此时这个值为最大的子数组和。

 

源代码:

 1 import java.util.Scanner;
 2 public class Array {
 3 
 4     public static void main(String[] args) {
 5         // TODO Auto-generated method stub
 6         Max m = new Max();
 7         m.setArray();
 8         m.ArrayMax();
 9     }
10 
11 }
12 class Max
13 {
14     int array[];
15     int cArray[];
16     int max;
17     int i;
18     int m;
19     void setArray()//输入数组
20     {
21         System.out.println("Please input your array length = 10");
22         array = new int [10];
23         Scanner s = new Scanner(System.in);
24         for(int i=0;i<10;i++)
25         {
26             array[i]=s.nextInt();
27         }
28     }
29 
30     void ArrayMax()//输出最大值
31     {
32         cArray = new int [11];
33         cArray[0] = 0;
34         for(i=0;i<10;i++)
35         {
36             cArray[i+1] = cArray[i]+array[i];                    
37             if(cArray[i+1]<0)
38             {
39                 cArray[i+2]=array[i+1];
40             }
41         }
42         //在数组中得到最大值
43         for(i=1;i<10;i++)
44         {
45             if(cArray[i+1]>=cArray[i])
46             {
47                 max = cArray[i+1];
48             }
49             else if(cArray[i+1]<cArray[i])
50             {
51                 m = cArray[i];
52                 cArray[i]=cArray[i+1];
53                 cArray[i+1]=m;
54                 max = cArray[i+1];
55             }
56         }
57         System.out.println("max is "+max);
58     }
59 }

结果截图:

总结:

进行求最大值时,若大于0 相加则变大 反之变小。