第四周星期一每日总结

    今日针对下午的课堂测试进行学习:如何求一个数组的和最大的子数组,这个题实际上当思维开拓了其实很简单,以下是我给出的关于不同情况的解决方法

一:不循环数组求和最大子数组,这个只需要从数组的第一项开始往下加,将最大值保存在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     }

 

posted on 2023-03-06 19:58  樱华旧梦  阅读(17)  评论(0)    收藏  举报