zoukankan      html  css  js  c++  java
  • 返回一个数组中的最大字数组的和

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

    负责人:赵顺杰,马帅强

    要求:

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

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

      求所有字数组的和的最大值,要求时间复杂度为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;
    }

     

     

  • 相关阅读:
    从输入url到浏览器加载过程(回答此问题的一个主干脉络)
    如何减少回流,重绘
    mac常用启动各种服务的命令
    分布式笔记搬迁
    JAVA基础
    EasyExcel引入
    mac 好用软件地址存储
    2018/4/11
    2018/04/04
    jdk各版本
  • 原文地址:https://www.cnblogs.com/mashuaiqiang/p/3611274.html
Copyright © 2011-2022 走看看