zoukankan      html  css  js  c++  java
  • 求数组中子数组的最大值

    结对开发:汪洋,辛垧      

         跟民哥上课还能练体力,天天背电脑上课,闲话就不多说了,步入正题吧,今天民哥花了一节课的时间给我们讲代码规范,第二节课就给了我们一个结对开发的小项目,题目这样的:求数组中子数组的最大值;要求两个人轮流开飞机。好吧,我们先来构思一下思路,然后我和洋哥果断把一张纸画的面目全非了,有图有真相

    接下来我给大家解释一下这张面目全非的图吧:首先拿数组的list[0]开刀,然后加上list[1]得到一个值,然后再加上list[2]得到一个值,一直加到数组的最后一个值;接下来拿list[1]开刀,一直到数组的最后一个元素,先来看一下我们最初的程序吧

    #include<iostream>
    using namespace std;
    
    int main()
    {
      int list[6]={-5,6,-3,11,-7,1};
      int i=0,max,j,n;
       max=list[0];
       for(i=0;i<6;i++)
       {
        for(j=i;j<6;j++)
        {
         int sum=0;
         for(int k=i;k<=j;k++)
         {
          sum=sum+list[k];
         }
         if(max<sum)
         {
             max=sum;
             for(int m=i;m<=j;m++)
             cout<<list[m]<<",";
             cout<<"中间过程比较最大值为"<<max<<endl;
         }
        }
       }
    cout<<"最终最大值为"<<max<<endl;
    return 0;
    }

    结果为:

    不仅输出了最后最大数组的和,而且还输出了最大数组中的元素,我和我的小伙伴(洋哥)都觉得我们做的还好吧,但民哥说我们的时间复杂度太大,这可给我们出难题了,于是我们课下就做了一些改进,但基本算法还是没变,因为我们的时间复杂度要以增加代码长度为代价,所以就目前来看,这是我们想到的最简单的办法,改进后的程序为:

    #include<iostream>
    using namespace std;
    int main()
    {
      //int list[6]={-5,6,-3,11,-7,1};
      int i=0,max,j,n;
    cout<<"输入数组的长度";
      cin>>n;
      int list[20];
      cout<<"请输入数组";
      for(i=0;i<n;i++)
       cin>>list[i];
       max=list[0];
       for(i=0;i<n;i++)
       {
        for(j=i;j<n;j++)
        {
         int sum=0;
         for(int k=i;k<=j;k++)
         {
          sum=sum+list[k];
         }
         if(max<sum)
         {
             max=sum;
             for(int m=i;m<=j;m++)
             cout<<list[m]<<",";
             cout<<"中间过程比较最大值为"<<max<<endl;
         }
        }
       }
    cout<<"最终最大值为"<<max<<endl;
    return 0;
    }

    运行结果为:

    改进后的程序可以自定义数组的长度和数组中的元素,具有更大的灵活性。

    至于减小时间复杂度的方法还希望各位大神们多多指教!

  • 相关阅读:
    Fire
    Apple Tree
    访问艺术馆
    三角关系
    字母表
    折纸
    旅行
    单词分类

    圆桌游戏
  • 原文地址:https://www.cnblogs.com/xinshang/p/3592164.html
Copyright © 2011-2022 走看看