簡單的小實驗 乙個陣列中的子陣列的和的最大值

2022-05-27 04:03:11 字數 1198 閱讀 2079

結對成員:李金吉,趙天

要求:實現查詢到乙個陣列的子陣列中元素的和的最大值,比如說:

int a=
這時我們發現9+8+-3+19 這個子陣列的和是最大的。

想法:如果是人腦的做法,無非從兩個開始比較,將兩個兩個的和計算出來;再三個三個比較,將三個的和計算出來.....

用計算機實現:

可以從陣列中第乙個開始,設定乙個輔助陣列記錄子陣列的和;

如圖:有個乙個陣列arr; a[0]~a[n]是輔助陣列;

a[0]=arr[0];

a[1]=arr[0]+arr[1];

a[2]=arr[0]+arr[1]+arr[2];

a[3]=arr[0]+arr[1]+arr[2]+a[3];

a[7]=arr[1];

a[8]=arr[1]+arr[2];

a[9]=arr[1]+arr[2]+arr[3];

可以發現a[0]=arr[0];

a[1]=a[0]+arr[2];

a[n-1]=a[n-2]+arr[n-1];

通過這種方法可以將這個陣列的每個子陣列的元素和都遍歷出來:

具體**及單元測試:

#include#define null -858993460

using namespace std;

void main()

; int arr2=;

int arr3=;

int arr4=;

int arr5[3];

int test(int list,int length);

cout<

這種演算法的時間複雜度o(n2)

老師說這種演算法的時間複雜度可以達到n,通過查閱資料知道,用2分法遍歷可是實現時間複雜度o(nlogn),利用類似數的遍歷(遞迴呼叫)實現時間複雜度o(n),

//令cursum(i)表示陣列下標以i為起點的最大連續下標最大的和,而maxsum(i)表示前i個元素的最大子陣列之和。

//那麼我們就可以推出下乙個maxsum(i+1)應該為cursum(i+1)和maxsum(i)中選取乙個最大值。遞推式為:

cursum(i) = max;

maxsum(i) = max;

求乙個陣列的連續子陣列的最大和

輸入乙個整型陣列,陣列中有正有負。陣列中的乙個或多個整數組成乙個子陣列。求所有子陣列的和的最大值,要求時間複雜度為o n 首先,根據題意,可能我們都會想到列舉陣列中所有的子陣列的和。我們都知道乙個長度為n的陣列,總共有n n 1 2個子陣列。計算出所有子陣列的和需要o n 2 時間。我們先來舉例分析...

找出乙個陣列中的」單身「

已知乙個陣列中,除了乙個數字出現一次外,其他數字都出現兩次,試找出這個數 思路分析 當看到這個題目,我就想,既然只有乙個數出現一次,那麼我們可以遍歷這個陣列,只要遇到相同的兩 個 數,就把它們置為乙個比較大的數,最後輸出那個沒有被改變的數。define crt secure no warnings ...

乙個陣列插入另乙個陣列引入的思考

今天在群裡有人丟擲了個問題 如何把 0,1,4 2,3 0,1,2,3,4 首先想到的是查下api有沒有相關的。於是找到了個 splice。splice的用法是 arrayobj.splice start,deletecount,item1 item2 itemn 引數是很多很多的引數,如item1...