1. 程式人生 > >返回一個整數數組最大子數組的和

返回一個整數數組最大子數組的和

length std bubuko cout elements pac col 隨機數 分享圖片

開始時間:14:00

結束時間:17: 20

要求

1,程序可以處理1000個元素;

2,每個元素是int32類型的;

3,整型數組有正數也有負數;

4,可以求出所有子數組的和的最大值,時間復雜度為O(n)

5,小組成員:於芳娜,張素穎

設計思路

1,

如果不考慮時間復雜度,我們可以枚舉出所有子數組並求出他們的和。不過非常進憾的是,由於長度為n的數組有O(n^2)個子數組,而且求一個長度為n的數組的和的時間復雜度為O(n).

因此這種思路的時間是O(n^3).

2,

很容易理解,當我們加上一個正數時,和會增加,當我們加上一個負數時,和合減少,如果當前得到的和是個負數,那麽這個和在接下來的累加中應該拋棄並重新清零。

不然的話這個負數將會減小接下來的和。

3,

調用隨機函數rand(),srand()生成隨機數組。

1 //2018.10.14
 2 //組內成員:於芳娜,張素穎
 3 //返回一個整數數組最大子數組的和
 4 #include<iostream>
 5 #include<time.h>
 6 #include<stdlib.h>
 7 using namespace std;
 8 int MaxSum(int data[],int length,int &start,int &end)
 9 {
10     int max=data[0];
11
int starttemp=0,endtemp=0;//定義開始和結束位置 12 int cursum=0;//定義元素和 13 if(data==NULL||length<0) 14 { 15 return 0; 16 }//數組為空的處理 17 for(int i=0;i<length;i++) 18 { 19 if(cursum<=0)//數組元素和小於零時,重置為第i個元素 20 { 21 cursum=data[i]; 22 starttemp=i;
23 endtemp=i; 24 } 25 else 26 { 27 cursum+=data[i];//數組元素大於零時,累加 28 endtemp=i; 29 } 30 if(cursum>max)//當前和大於最大和,則重置最大和 31 { 32 max=cursum; 33 start=starttemp;//子數組元素開始及結束位置 34 end=endtemp; 35 } 36 } 37 return max; 38 } 39 int main() 40 { 41 int n; 42 cout << "Number of elements in array:" << endl; 43 cin >> n; 44 srand((unsigned)time(NULL));//實現不同隨機數的生成 45 int data[n]; 46 { 47 for(int j=0;j<n;j++) 48 { 49 data[j]=rand()%2001-1000; 50 cout<<data[j]<<" "; 51 }//輸出-1000到1000的1000個隨機數 52 } 53 int length=sizeof(data)/sizeof(int);//數組長度計算 54 int start=0,end=0; 55 int result=MaxSum(data,length,start,end);//調用函數 56 cout << endl; 57 cout<<"MaxOfSubarrays="<<endl; 58 for(int i=start;i<=end;i++) 59 cout<<data[i]<<" ";//輸出最大子數組 60 cout<<endl; 61 cout<<"MaxSumOfSubarrays="<<" "<<endl; 62 cout<<result<<endl;//輸出最大子數組的和 63 return 0; 64 }

設計過程中遇到的問題

1,初始階段,沒有明確的設計思路可以將最大子數組的和表示出來,以至於設計出的代碼僅僅只適用於一兩個數組,不能做到很好的泛化。

解決方案:查閱並借鑒相關資料,完善自己的設計思路。

2,隨機數的生成過程之中,不知道生成負的隨機數的方法

解決方案:查閱並借鑒相關資料,擴大了生成隨機數的範圍。

3,代碼寫完之後存在多處運行錯誤

解決方案:逐一調試。

運行截圖

技術分享圖片

技術分享圖片

對於子數組之和大於整型表示的最大範圍時出現情況的觀察

把生成隨機數的位數放大至1*10^20---2*10^20,會出現以下情況:

技術分享圖片

技術分享圖片

總結

這是第一次由兩個人共同完成一個編程,在編程過程之中分工明確,共同解決一些技術上的難題,體會到對各種函數的使用和編寫還不是特別熟練,容易出現卡殼現象,

今後會多讀一些程序代碼,提高自己的編程能力。

小組成員合照

技術分享圖片

返回一個整數數組最大子數組的和