一.题目:
返回一个整数数组中最大子数组的和。
二.要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
三.成员
主要的由付东和岳竞一一起共同结对开发完成。
付东主要负责程序分析,代码编程。
岳竞一责代码复审和代码测试计划。
四.设计思路
首先我们的第一个思路是将一个环状数组转换成一个一维数组,再根据一位数组的解决办法来结觉问题,但是我们遇到了问题,我们的一维数组为完全遍历,不能控制遍历个数,所以这个想法不错,但是不能实现。
后来我们又考虑到了,可以将一个n维的环状数组转化成n个最大的子数组,然后分别求最大字数组的最大子子数组,然后比较这几个的大小求出最大值,则为环状的数组的子数组和的最大值。
五.源代码
#include<iostream.h>
#include<stdlib.h>
int Maxsum(int *a,int n)//一维数组的求最大
{
int tempstart =0,sum=0,max=-1000;
int i;
int start,end;
start=end=0;
for(i=0;i<n;i++)
{
if(sum<0)
{
sum=a[i];
tempstart=i;
}
else
{
sum+=a[i];
}
if(sum>max)
{
max=sum;
start=tempstart;
end=i;
}
}
// cout<<"start="<<start<<endl<<"end="<<i<<endl;
return max;
}
int main()
{
int b[10000];
int max[10000];
int num,i;
cout<<"输入数组成员个数:";
cin>>num;
for(i=0;i<num;i++)
{
b[i]=(rand()%1000)-500;
}
cout<<"输出数组:"<<endl;
for(i=0;i<num;i++)
{
cout<<b[i]<<"\t";
}
cout<<endl;
//-----------------------------
for(i=0;i<(num-1);i++) //将环状数组转换为一维数组
{
b[num+i]=b[i];
}
int d[1000],st,en;
for(i=0;i<num;i++) //将一维数组转换为n个最大子数组
{
for(int j=0;j<num;j++)
{
d[j]=b[i+j];
max[i]=Maxsum(d,num);
}
}
int maxm=max[0];//比较n个最大子数组的最大子数组的最大值
for(i=0;i<num;i++)
{
if( maxm>max[i])
{
maxm=max[i];
}
}
//---------------------------
cout<<"最大子数组和为:"<<maxm<<endl;
return 0;
六.结果截图
}
七.设计总结
有的时候设计思路简单,但是实现方式困难,所以要根据自己的能力用自己能够使用但不一定简单的俄设计思路有时候能够更快的完成题目的要求。
这次的结对让我感受颇深,刚开始就有思路,但是实现用了非常多的时间,原来思路不能更升入。
结对开发虽然要求两个人的合作,但是这也要求 两个人都有能力,各自的互补,不然都开在一个地方的时候,往往得不偿失。