求数组中子数组的最大值
结对开发:汪洋,辛垧
跟民哥上课还能练体力,天天背电脑上课,闲话就不多说了,步入正题吧,今天民哥花了一节课的时间给我们讲代码规范,第二节课就给了我们一个结对开发的小项目,题目这样的:求数组中子数组的最大值;要求两个人轮流开飞机。好吧,我们先来构思一下思路,然后我和洋哥果断把一张纸画的面目全非了,有图有真相
接下来我给大家解释一下这张面目全非的图吧:首先拿数组的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; }
运行结果为:
改进后的程序可以自定义数组的长度和数组中的元素,具有更大的灵活性。
至于减小时间复杂度的方法还希望各位大神们多多指教!