设计思想:
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 相加则变大 反之变小。