此次编程题为:求一个整数数组最大子数组之和,要求时间复杂度为O(n)。
首先,我们对题目做出分析,做出第一种预行方案,即定义一个数组,当数组中元素大于等于0时,进行累加;若小于0,则与后面的数作比较,若和大于0则继续累加,小于零则以刚才的结果作为一个值,以此类推,最后比较各值,找出最大值。但在编程的过程中,发现这样做很繁琐,同时发现问题,即若有0,或两个值相等该取哪个。最后进行改进,得到最后结果。在做测试时,主要有四类,全正,全负,全0和有正有负有0,每组数也有改变。
通过这次互换驾驶员与领航员的角色,让我们开阔了思路,逐步完善方案,体验到了结对开发的优势。
1 #include<iostream.h> 2 int begin,end,max; 3 void Max(int s[],int n) 4 { 5 int c,d; 6 c=max=s[n-1]; 7 d=n-1; 8 begin=n-1; 9 end=n-1; 10 for(int i=n-2;i>=0;i--) 11 { 12 if(c>0) 13 c=c+s[i]; 14 else 15 { 16 c=s[i]; 17 d=i; 18 } 19 if(max<=c) 20 { 21 begin=i; 22 end=d; 23 max=c; 24 } 25 } 26 } 27 void main(){ 28 int e1[6]={0,0,0,0,0,0}; 29 int e2[6]={1,2,4,5,6,3}; 30 int e3[6]={-3,-3,-1,-5,-4,-7}; 31 int e4[6]={1,4,0,-3-1,8}; 32 Max(e1,6); 33 cout<<"e1×î´ó×ÓÊý×éÖ®ºÍΪ"<<max<<endl; 34 Max(e2,6); 35 cout<<"e2×î´ó×ÓÊý×éÖ®ºÍΪ"<<max<<endl; 36 Max(e3,6); 37 cout<<"e3×î´ó×ÓÊý×éÖ®ºÍΪ"<<max<<endl; 38 Max(e4,6); 39 cout<<"e4×î´ó×ÓÊý×éÖ®ºÍΪ"<<max<<endl; 40 }