找一个数组的最大和的连续子数组(时间复杂度 O(n))

设计思想

一开始的思想是求出全部的情况,再分别比较大小,这种方法适用于有限个数组,不适用于输入数组长度和内容的情况。

但也试着做了

 1 int a[]= {-1,2,6,-10};
 2         int size=4;
 3                 int maxa=a[0];
 4         for(int i=0;i<size;i++) {
 5             if(maxa<a[i])
 6                 maxa=a[i];
 7         }
 8         //对于两个数一组
 9         int b[]=new int[size-1];  
10         for(int i=0;i<size-1;i++) {
11             b[i]=a[i]+a[i+1];
12         }
13         //再遍历b数组
14         int maxb=b[0];
15         int sizeb=size-1;
16         for(int i=0;i<sizeb;i++) {
17             if(maxb<b[i])
18                 maxb=b[i];
19         }
20         //对于三个数一组
21         int c[]=new int[size-2];
22         int sizec=size-2;
23         for(int i=0;i<sizec;i++) {
24             c[i]=a[i]+a[i+1]+a[i+2];
25         }
26         //再遍历c数组
27         int maxc=c[0];
28         for(int i=0;i<sizec;i++) {
29             if(maxc<c[i])
30                 maxc=c[i];
31         } 
32         //对于四个数一组
33         int maxd=0;
34         for(int i=0;i<size;i++) {
35             maxd=maxd+a[i];
36         }
37         
38         //比较这些组合的大小
39         int max1=0;
40         int max2=0;
41         int max=0;
42         if(maxa>maxb) {
43             max1=maxa;
44         }else {
45             max1=maxb;
46         }
47         if(maxc>maxd) {
48             max2=maxc;
49         }else {
50             max2=maxd;
51         }
52         if(max1>max2) {
53             max=max1;
54         }else {
55             max=max2;
56         }
57         System.out.println("连续子数组的最大值为:"+max);                 

 

这种方法比较傻,下面是我参考了网上的之后自己动手解决的。

设计思想:

把最大值sum赋值为0,curr是当前数值,curr=curr+下一个数  依次类推,若curr为负数,就让curr

为0,否则就判断sum和curr的大小关系,sum=较大的那个数。

 1         Scanner sc=new Scanner(System.in); 
 2         //定义数组长度和数组
 3         //输入数组长度
 4         System.out.println("请输入数组的长度:");
 5         int size=sc.nextInt();
 6         int a[]=new int[size];
 7         int sum=0;
 8         int curr=0;
 9         
10         
11         //输入数组的内容
12         System.out.println("请输入数组内容:");
13         for(int i=0;i<size;i++) {
14             a[i]=sc.nextInt();
15         }
16         
17         
18         //有负有正
19         for(int i=0;i<size;i++) {
20             curr=curr+a[i];
21             if(curr<0) {
22                 curr=0;
23             }else {
24                 if(sum<curr) {
25                     sum=curr;
26                 }else {
27                     sum=sum;
28                 }
29             }
30         }
31         //若全是是负数
32         if(sum==0) {
33             int sum1=a[0];
34             for(int i=0;i<size-1;i++) {
35                 if(sum1>a[i+1]) {
36                     sum1=sum1;
37                 }
38                 else {
39                     sum1=a[i+1];
40                 }
41             }
42             sum=sum1;
43         }
44         
45         System.out.println("连续子数组的最大值为:"+sum);

全是负数的情况

遇到的问题:

1,最开始没有比较curr和sum的大小关系,而直接让sum=curr,会导致sum为最后一个为正的数

2,忘记考虑全是负数的情况,导致全为负数,sum的值=0。

总结:

在设计此类题的时候,要考虑周到,在时间复杂度为o(n)的条件下,把各种情况都要考虑到。

还要多尝试,写出来代码出错后要一步一步推敲错在哪里,分析分解,再锁定错的地方,是解决问题的关键。

 

posted @ 2019-03-09 10:29  小神龙1258  阅读(742)  评论(0编辑  收藏  举报