第一种方法:
此种方法的思想较为简单:先找出从第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 }