1. 程式人生 > >結對開發之《返回一個整數陣列中最大子陣列的和》

結對開發之《返回一個整數陣列中最大子陣列的和》

一、題目要求

題目:返回一個整數陣列中最大子陣列的和。

 要求: 輸入一個整形陣列,數組裡有正數也有負數。 陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。

            如果陣列A[0]……A[j-1]首尾相鄰,允許A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。 同時返回最大子陣列的位置。 

            求所有子陣列的和的最大值。要求時間複雜度為O(n)。

 結對程式設計要求: 兩人結對完成程式設計任務。

                          一人主要負責程式分析,程式碼程式設計。 一人負責程式碼複審和程式碼測試計劃。 

                          發表一篇部落格文章講述設計思想,出現的問題,可能的解決方案(多選)、原始碼、結果截圖、總結。

                        (截止時間11月4日晚18:00之前)

二、設計思路

把該環形陣列從某一點展開,連寫兩遍(複製一份接到自己後面),然後當成無環的陣列求最大子陣列和,但這裡要限制一個條件,就是最大子陣列的長度不可以超過n,所以求的時候要注意判斷。例如:展開寫兩遍為1 2 3 4 5 1 2 3 4 5.
這種情況下限定最大子陣列的長度不可以超過n的作用:假如陣列為{-1,2,3,4},則展開復制一份接到自己後面為-1,2,3,4,-1,2,3,4,此時若直接求則為2,3,4,-1,2,3,4,很明顯不對了,所以要限定最大子陣列的長度不可以超過n

三、程式碼

#include <stdlib.h>
#include<iostream>
#include<time.h>
#define n 7
using namespace std;

void main()
{
    int a[n],i,j,z=0,y[n][n],x1=0,x2=0,t,m;


    srand((int)time(0));

    //陣列的元素值由隨機函式產生
    for(i=0;i<n;i++)
    {
        a[i]=-rand()%36+25;
    }

    //輸出陣列的元素值
    for(i=0;i<n;i++)
    {
        cout<<a[i]<<endl;
    }

    //求子陣列
    for(i=0;i<n;i++)
    {
        m=i;
        z=0;
        j=0;
        while(j<=n-1)
        {
            z+=a[m];
            y[i][j]=z;
            m++;
            if(m>n-1)
            {
                m=0;
            }
            j++;
        }
    }

    t=y[0][0];
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(y[i][j]>t)
            {
                t=y[i][j];
                x1=i;
                x2=j;
            }
        }
    }

    cout<<"最大子陣列的值為:"<<t<<endl;
    cout<<"子陣列中元素的下標為:"<<endl;

    i=0;

    while(i<=x2)
    {
        cout<<x1<<"  ";
        x1++;
        if(x1>=n)
        {
            x1=0;
        }
        i++;
    }

    cout<<endl;
    system("pause");

}

 

四、程式執行結果

五、總結

  這次的程式,在我剛剛看到的時候,簡直一點思路都沒有,所以最後採取的一個同學的思路,在程式設計的過程中我們還遇到了許多的問題,比如不知道如何把第一個數字移到陣列的最後面,後來經過問同學,研究終於得到了解決。還有遇到了閃退的問題,最後是我的小夥伴尋求了外援才解決的。因為有了之前一維陣列求最大子陣列的經驗,這次的實驗,在之前的基礎上操作,在明確了設計思路,有了程式設計解決問題的想法之後,顯得簡單了不少。感覺這次的程式設計題目主要是這種解決問題的思路值得借鑑。雖然我和我的小夥伴都不太會程式設計,但是我們還是努力完成了這個題目,也許這就是一點點的進步吧,在以後的過程中,我們會再接再厲,爭取能夠獨立完成一個程式。

六、工作照