求数组中子数组的最大值

结对开发:汪洋,辛垧      

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

接下来我给大家解释一下这张面目全非的图吧:首先拿数组的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;
}

运行结果为:

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

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

原文地址:https://www.cnblogs.com/xinshang/p/3592164.html