標籤:
一、題目及要求:
1、題目:返回一個整數數組中最大子數組的和。
2、要求:
①輸入一個整形數組,數組裡有正數也有負數;數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和;求所有子數組的和的最大值;要求時間複雜度為O(n)。
②兩人結對完成編程任務;一人主要負責程式分析,代碼編程,一人負責代碼複審和代碼測試計劃。
3、結對人員:胡亞寶 焦燕
二、設計思路:
①第一個方法,定義一個數組,將所有的子數組都列出來,再將它們的和都求出來放到該數組中,再求最大值,輸出。但是在編寫過程中,我們發現如果用迴圈方式存放,則序號不方便排,於是我們又想到邊存邊比,從第一個數開始,求出所有包含它的數組,依次求和,將最大值存入max。這樣的確實現了要求的功能,但是時間複雜度為O(n*n),不符合要求。
②第二個方法,我們發現,如果從第一個數開始加,加到某一值,當此時的和為負數時,無論後面是什麼值,都不可能最大,則將前面的和值捨棄,直接從下一個開始加,仍舊是邊加邊比,直到求出最大值,此時只有一個for迴圈,事件複雜度為O(n)。
三、原始碼:
#include "stdafx.h" 3 4 int _tmain(int argc, _TCHAR* argv[]) 5 { 6 7 //第一種方法 8 int i,j,k,a[5]; 9 int Sum,Max;10 Max = a[0]; 11 printf("請輸入5個整數:\n");12 for(k=0;k<5;k++)13 {14 scanf("%d",&a[k]);15 }16 17 for(i=0;i<5;i++) 18 { 19 Sum = 0; 20 21 for(j=i;j<5;j++) 22 { 23 Sum =Sum+ a[j]; 24 if(Sum > Max) 25 Max =Sum; 26 } 27 } 28 printf("最大連續子數組的和為:%d\n",Max);29
//第二種方法 int i,j,a[5]; printf("請輸入5個整數:\n"); for(j=0;j<5;j++) { scanf("%d",&a[j]); } int Max = 0; int Sum = 0; for(i=0;i<5;i++) { Sum =Sum + a[i]; if(Sum > Max) Max = Sum; 3 if(Sum < 0) //如果和小於0,則從下個元素重新開始累加 Sum = 0; } printf("最大連續子數組的和為:%d\n",Max);*/ return 0; }
測試資料:
-3 -6 -1 -8 -7(全為負數)
5 3 -9 0 9 (數組中有正數、負數、0)
6 9 -5 1 6 (數組中有正有負,但最大子數組不包含負數)
4 -2 3 -6 8 (此最大子數組包括負數)
四、心得體會:
因為胡亞寶基礎比我好,所以她主要負責在確定方法後進行代碼編程,我則主要負責代碼的測試。但思路都是靠兩個人共同的探討才出現的。我和胡亞寶一起合作發現她有好多優點值得我學習,她比較愛動手,有什麼想法都愛在紙上畫畫,本上敲敲。我老是悶頭想,這是不對的。但是兩個人一起合作,互相補充。整個進程都很輕鬆,愉快。
在測試時,胡亞寶的代碼正確完整。我們採用了上節課老師教的方法進行測試。第一組全是負數;第二組只有一個負數,負數在最中間;第三組則正負相間。三組測試結果和預測的結果一致。
軟體工程課堂訓練——結對開發