返回一个数组中的最大字数组的和

返回一个数组中的最大字数组的和

负责人:赵顺杰,马帅强

要求:

  输入一个整形数组,数组里有正数也有负数。

  数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

  求所有字数组的和的最大值,要求时间复杂度为O(n)

结对编程要求:

  两人结对完成变编程任务。

  一人主要负责程序分析,编写代码。

  一人负责代码复审和代码测试计划。

  在王老师布置任务后,赵顺杰和我决定先讨论一套编程方案,然后再实行代码编写,一共讨论了两套计划:

  第一种:设置数组为a[5],从第一个元素起,把累加的和赋值给max,如果后一个元素加入后max变大,就继续累加下去,如果变小,则舍弃前面已经累加的所有元素,从当前元素开始再赋值给max。结果是方案失败,原因是可能在最后的max值没有前面的子数组的和大,忽略掉了前面已经舍弃的元素。

 

  第二种:按照个数进行子数组的分配。比如数组为a[5],首先让子数组的元素个数是5,加上所有元素的和赋值给新定义的数组b[0];然后让子数组的元素的个数为4,有两种情况,前面四个或者后面四个,然后让它们的和赋值给b[1]b[2];然后让子数组的元素的个数为3,这样就有三种情况......以此类推,最后把所有得到的字数组的和全部放到b的数组里。再进行排序,输出最大值。讨论的结果是失败,因为要用到很多次的循环,循环的嵌套造成了时间复杂度的增加。

  在周三的上午,我们通过互相讨论以及和其他的分组交换意见,得到了一个求出最大值的解决方案:设置了加数和sum,变量t,初始值都为0,将元素进行循环,当t<0时,将元素值赋给t,否则就t=t+sum,如果sum<t时,sum=t,最后返回到sum,在主函数中点用函数输出即可。

  下面的两个图分别是方案一和方案二,最后的代码是最终的方案:

 

 

 

 

 

 

#include<iostream.h>
#define N 10
int max(int a[N])
{
    int sum=0,t=0;
    int i;
    for(i=0;i<N;i++)
    {
        if(t<0)
            t=a[i];
        else
            t=t+a[i];
        if(sum<t)
            sum=t;
    }
    return sum;
}

void main()
{
    int a[N]={2,-3,25,-20,13,-5,-18,20,-7,-12};
    cout<<"最大子数组的和是:"<<max(a)<<endl;
}

 

 

 

posted @ 2014-03-19 14:09  十年后的小马哥  阅读(432)  评论(0编辑  收藏  举报