结对开发——求最大值

一、题目:

      返回一个整数数组中最大子数组的和。

  要求:

  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 }

四、结果截图

五、心得体会

  我和于同学之前就经常合作,所以这次搭档还算顺利。我俩上课的时候就讨论出了这个题目的大体思路,今天我们又对算法的具体实现进行了讨论和调试。

  俗话说:“男女搭配,干活不累。”我比较细心,他比较有执行力。于同学可以带起整个编程创作的气氛,我也很快进入状态,能够及时准确的发现他的错误并快速改正。整个过程效率比自己编程时要高。

  其实一开始我根据我和搭档确定的思路写出了算法,但是运行时有错并且特别复杂。我们调试了几次都没能成功,于是他就换了种思考方式,很快写了新的算法。经过几次调试之后,程序成功运行了。这一点我挺欣赏他的,因为它发现这条路走不通或特别难走时,可以马上改变路径正确的到达目的地。

六、有图有真相

  请无视我那无神的双目,和那油油的头发...

 

原文地址:https://www.cnblogs.com/JJJanepp/p/4346942.html