结对开发——循环数组的最大值

题目要求:

  

  返回一维数组中最大子数组的和

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

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

  如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。

  同时返回最大子数组的位置。

  求所有子数组的和的最大值。

  要求时间复杂度为O(n)

设计思路:(结对思考以及参考于其他同学)

  考虑到数组需要首尾相连,采取把数组的长度增加两倍,并把复制的数组写在在最后一个数的后面,这样在循环的过程中并不需要采用新的算法,只要把原来的代码稍微修改一下,加一个判断使得组成最大数组的长度不超过原数组的长度即可。

三,代码

#include <iostream.h> 
#include <stdlib.h> 
int main() 
{ 
    int num,length,start,finish; 
    start=0; 
    finish=0; 
    cout<<"请输入数组元素个数:"; 
    cin>>length; 
    num=2*length;       //分配2倍数组空间,方便下次比较 
    int* Array=new int[num];     //分配数组空间 
      
    for(int i=0;i<length;i++)    //数组正负交替出现 
    {    
        if(i%2==0) 
            Array[i]=rand()%1000; 
        else
            Array[i]=0-(rand()%1000); 
    } 
    cout<<"数组为:"; 
    for(i=0;i<length;i++) 
    {     
        cout<<Array[i]<<" "; 
    } 
    cout<<endl; 
  
    //以下代码参考与其他同学以及度娘 
    int max=Array[0]; 
    int sum=0;      //定义求和变量 
    for(i=0;i<length;i++) 
    { 
       sum=0; 
       for(int j=i;j<length+i;j++) 
       { 
           sum=sum+Array[j]; 
           if(sum>max) 
           { 
               max=sum; 
               start=i; 
               finish=j; 
           } 
       } 
       Array[length+i]=Array[i];  //每次将已经计算过的数放到最后 
    } 
    if(finish>=length) 
    { 
        cout<<"最大子数组起始位置为:"<<start+1<<endl; 
        cout<<"最大子数组终止位置为:"<<finish-length+1<<endl; 
    } 
    else
    { 
        cout<<"最大子数组起始位置为:"<<start+1<<endl; 
        cout<<"最大子数组终止位置为:"<<finish+1<<endl; 
    } 
    cout<<"最大子数组为:"<<endl; 
    for(int m=start;m<=finish;m++) 
    { 
        cout<<Array[m]<<" "; 
    } 
    cout<<endl; 
    cout<<"最大子数组的和为:"<<endl; 
    cout<<max<<endl; 
  
    delete []Array; 
    return 0; 
} 

四,实验截图

五,结对开发体会

本次实验明显队友比我付出的多,但是这也体现了结对开发的魅力所在,并不是说每个人付出的必须等价,让每个人处于尽可能自由的状态有时候会事半功倍。

原文地址:https://www.cnblogs.com/lllzy/p/4379550.html