结对开发之求任意一个数组的最大子数组

一.题目:

 返回一个整数数组中最大子数组的和。

  要求:

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

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

  3.求所有子数组的和的最大值。要求时间复杂度为O(n)。

二.设计思想。

将接收的数组放到a[i],将接收的数组中的所有子数组的和放到b[i]中,然后找出最大值max,即为该数组的最大子数组和。

将最大值的脚标放到s[i]中,求出 最大子数组的首个数字的脚标s[i],与连续相加数字的个数t[i]。

三.代码。

#include<iostream.h>
#define MAX 10000
int main()
{
    int k,t[MAX],o=0,d=0;
    int n=0,m=0;
    int b[MAX],a[MAX];
    int s[MAX];
    cout<<"请输入数组中整数的个数:"<<endl;
    cin>>k;
    for(int i=0;i<k;i++)
    {
        cin>>a[i];
    }
    for(int l=1;l<k+1;l++)
    {
        for(i=0;i<k-l+1;i++)
        {
            for(int j=i;j<i+l;j++)
            {
                if(j>k-1)
                {
                    break;
                }
                else
                    m=m+a[j];
            }
            b[n]=m;
            m=0;
            n=n+1;
        }
    }
    int max=b[0];
    for(i=1;i<n;i++)
    {
        if(max<b[i])
            max=b[i];
    }
    for(i=0;i<n;i++)
    {
        if(max==b[i])
        {
            s[d]=i+1;
            d++;
        }
        
    }
    int r=k;
    for(i=0;i<d;i++)
    {
        t[i]=0;
        for(int j=0;j<k;j++)
        {
            if(s[i]>=r&&r>=0)
            {
                s[i]=s[i]-r;
                t[i]=t[i]+1;
                r=r-1;
            }
            if(s[i]==0&&r>0&&j!=k-1)
            {
                s[i]=s[i]+r+1;
                break;
            }
            if(s[i]==0&&r==0&&t[i]==k)
            {
                s[i]=s[i]+1;
                break;
            }
        }
        r=k;
    }
    cout<<"该数组中的最大子数组的和为:"<<max<<endl;
    cout<<"这样的子数组一共有"<<d<<""<<endl;
    for(i=0;i<d;i++)
    {
        s[i]=s[i]-1;
    }
    for(i=0;i<d;i++)
    {
        if(d==1)
            cout<<"该子数组为:"; 
        else
            cout<<""<<i+1<<"组子数组为:";
        if(t[i]==0)
        {
            t[i]=1;
        }
        for(int j=s[i];j<s[i]+t[i];j++)
        {
            cout<<a[j]<<"   ";
        }
        cout<<endl;
    }
    return 0;    
}

四.运行结果。

五.体会。

结对开发可以使得小组有更多的设计思路,可以拓展每个人的思路,从中找出更加简便的算法,有问题时两个人可以互相讨论,更好地解决问题。

当一个人编程时,另外的人可以从旁观者的角度更好的能发现一些问题。避免自己编程时出现问题,找不出问题原因。

结对开发最好的方面就是使得程序更加优化。

六.工作照片。

 

posted @ 2015-03-19 19:08  努力的学渣  阅读(131)  评论(0编辑  收藏  举报