找一个数组的最大和的连续子数组(时间复杂度 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)的条件下,把各种情况都要考虑到。
还要多尝试,写出来代码出错后要一步一步推敲错在哪里,分析分解,再锁定错的地方,是解决问题的关键。