第四周星期一每日总结
今日针对下午的课堂测试进行学习:如何求一个数组的和最大的子数组,这个题实际上当思维开拓了其实很简单,以下是我给出的关于不同情况的解决方法
一:不循环数组求和最大子数组,这个只需要从数组的第一项开始往下加,将最大值保存在max中,遇见负数则将sum置零,然后跳出循环,最终可得到和最大子数组。
代码如下:
1 public static int Largest(int list[], int length) { 2 int sum=0; 3 int max=0; 4 for (int i = 0; i < (length); i++) 5 { 6 if(list[i]<0) 7 { 8 sum=0; 9 continue; 10 } 11 else 12 { 13 sum += list[i]; 14 } 15 if(max<sum) 16 { 17 max=sum; 18 } 19 } 20 return max; 21 } 22 public static void main(String[] args) { 23 int a[]={1,-2,3,4,-5,-6,-7,8,9}; 24 int max=0; 25 max=Largest(a,a.length); 26 System.out.println(max); 27 28 }
二.对于循环数组求和,考虑首尾相接的情况,我采取两边循环求解的方式解决,第一遍循环求出非循环情况下的数组和最大子数组,用max记录,第二遍循环在第一遍max的基础往上加,如果第二遍循环前几项的sum<0,则和最大子数组的值为第一遍的max,,如果前几项和sum>=0,则在第一遍基础上加,直到第二遍sum<0;
代码如下:
1 public static int Largest(int list[], int length) 2 { 3 int max=0; 4 int sum=0; 5 int i=0; 6 for(int j=0;j<length;j++) 7 { 8 if(sum<0){ 9 sum=list[j]; 10 }else { 11 sum+=list[j]; 12 } 13 if(max<sum) 14 { 15 max=sum; 16 } 17 } 18 for(i=0;i<length;i++) 19 { 20 if(sum<0){ 21 sum=list[i]; 22 }else { 23 sum+=list[i]; 24 } 25 if(max<sum) 26 { 27 max=sum; 28 } 29 } 30 31 32 return max; 33 } 34 35 public static void main(String[] args) { 36 int a[]={1,-2,3,4,-5,-6,-7,8,9}; 37 int max=0; 38 max=Largest(a,a.length); 39 System.out.println(max); 40 41 }
浙公网安备 33010602011771号