一、题目:
返回一个整数数组中最大子数组的和。
要求:
1.输入一个整形数组,数组里有正数也有负数。
2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3.求所有子数组的和的最大值。要求时间复杂度为O(n)。
二、设计思路
1.数组num[]长度已确定是N,将数组中字数组的和放到数组sum[]中;
2.sum[0]=num[0],sum[1]=num[0]+num[1],sum[2]=num[0]+num[1]+num[2]……;
sum[N]=num[1],sum[N+1]=num[1]+num[2]……如此循环,直至所有自己的和全部存进 数组sum中;
3.然后求出数组sum中的最大值,再输出结果;
4.单独判断一些特殊的容易计算的情况,比如全是负数、全是正数、只有一个正数。这样能有效地提高程序的效率。
三、源代码
1 // 求和.cpp : Defines the entry point for the console application. 2 // 2015/3/18 16:12 袁佩佩 于海洋 信1201-1班 3 4 #include "stdafx.h" 5 #include"iostream.h" 6 #define SIZE 5 //数组的个数 7 #define MAXSIZE 100 //子集个数的最大值 8 void CaculateSum(int sum[],int length,int num[])//计算数组中各个子集的和 9 { 10 int j=0; 11 for(int i=0;i<SIZE;i++) 12 { 13 for(int k=i;k<SIZE;k++) 14 { 15 if(i==k) 16 { 17 sum[j]+=num[k]; 18 } 19 else 20 { 21 sum[j]=sum[j-1]+num[k]; 22 } 23 j++; 24 } 25 } 26 } 27 //求所有情况的个数 28 int GetAcc() 29 { 30 int acc=0; 31 for(int i=1;i<=SIZE;i++) 32 { 33 acc+=i; 34 } 35 return acc; 36 } 37 //找出数组中的最大值,length是b[]中的个数 38 int GetMax(int b[],int length) 39 { 40 int max=b[0]; 41 for(int i=0;i<length;i++) 42 { 43 if(max<b[i]) 44 { 45 max=b[i]; 46 } 47 } 48 return max; 49 } 50 int main() 51 { 52 int num[SIZE],sum[MAXSIZE],max=0,acc; 53 int count[2]={0,0}; //num[num]是要求的整数count[2]中是负数和正数的个数 54 cout<<"请输入"<<SIZE<<"个整数:"; 55 for(int i=0;i<SIZE;i++) //计算数组中正数和负数的个数 56 { 57 cin>>num[i]; 58 if(num[i]<0) 59 count[0]++; //负数的个数 60 else 61 count[1]++; //正数 62 } 63 acc=GetAcc(); 64 for(i=0;i<acc;i++) 65 { 66 sum[i]=0; 67 } 68 if(count[0]==0) //若全是正数的话 69 { 70 for(int i=0;i<SIZE;i++) 71 { 72 max+=num[i]; 73 } 74 } 75 else if((count[1]==0)||(count[0]==1)) //若全是负数或者有一个正数 76 { 77 max=GetMax(num,SIZE); 78 } 79 else //其他情况 80 { 81 CaculateSum(sum,acc,num); 82 max=GetMax(sum,acc); 83 } 84 cout<<"最大子集的和是:"<<max<<endl; 85 return 0; 86 }
四、结果截图
五、心得体会
我和于同学之前就经常合作,所以这次搭档还算顺利。我俩上课的时候就讨论出了这个题目的大体思路,今天我们又对算法的具体实现进行了讨论和调试。
俗话说:“男女搭配,干活不累。”我比较细心,他比较有执行力。于同学可以带起整个编程创作的气氛,我也很快进入状态,能够及时准确的发现他的错误并快速改正。整个过程效率比自己编程时要高。
其实一开始我根据我和搭档确定的思路写出了算法,但是运行时有错并且特别复杂。我们调试了几次都没能成功,于是他就换了种思考方式,很快写了新的算法。经过几次调试之后,程序成功运行了。这一点我挺欣赏他的,因为它发现这条路走不通或特别难走时,可以马上改变路径正确的到达目的地。
六、有图有真相
请无视我那无神的双目,和那油油的头发...