最大子串行和問題求解

2021-08-03 03:59:26 字數 2412 閱讀 3301

基本思想:窮舉式的嘗試所有可能,通過三層迴圈計算所有子串行的和。

演算法步驟:

1.第一層迴圈從0到n-1,確定子串行的開始位置;

2.第二層迴圈從第一層迴圈變數開始到n-1,確定子串行的結束位置;

3.第三層迴圈從第一層迴圈變數開始到第二層迴圈變數結束,計算這個子串行的和,並與最大子串行和比較,如果大於最大子串行和就賦值給最大子串行和。

o(n³)

int maxsubsequencesum_1(int a, int n)

} return maxsum;

}

基本思想:窮舉所有可能,通過兩層迴圈實現,與第乙個演算法相比較,減小了第三層迴圈,不需要每次都從第一層迴圈變數的位置開始累加子串行。

演算法步驟:

1.第一層迴圈從0到n-1,確定子串行的初始位置;

2.第二層迴圈從第一層的迴圈變數開始到n-1,對當前序列和進行累加陣列中的元素,並與最大子串行和比較,如果大於最大子串行和,則賦值給最大子串行和。

o(n²)

基本思想:通過分治思想,最大子串行和可能在三處出現,或者整個出現在輸資料的左半部,或者整個出現在右半部,或者跨越輸入資料的中部從而佔據左右兩部分。前兩種情況遞迴求解,第三種情況的最大和通過求出前半部分的最大和(包含前半部分的最後乙個元素)以及後半部分的最大和(包含後半部分的第乙個元素)而得到。

演算法步驟:

1.遞迴的基準情況處理,及如果left==right,並且當該元素最大時,它就是最大子串行;

2.計算序列的中間值並,遞迴求解最大子串行在全部在左半部分出現,或者全部在右半部份出現的情況;

3.使用兩個迴圈分別計算前半部分的最大和(包含前半部分的最後乙個元素)以及後半部分的最大和(包含後半部分的第乙個元素);

4.返回三種情況計算出最大和的最大一種情況並返回。

o(n log n)

int max3(int i, int j, int k)

int maxsum(int a,int left,int right)

rightbodersum = maxrightbodersum = 0;

for (i=center+1;i<=right;i++)

return max3(maxleftsum, maxrightsum, maxleftbodersum+ maxrightbodersum);

}int maxsubsequencesum_3(int a, int n)

遞迴實現:

int mymaxsubarray(vector& nums ,int i,int* pointtomaxsum)

class solution

};

動態規劃實現:

class solution 

return maxsum;

}};

空間:o(n)

動態規劃改進:

因為只需要儲存上次計算的總和就可以了,不需要用陣列維持每次計算後的總和。

修改後的**:

class solution 

return maxsum;

}};

或者從0開始,這樣修改;

class solution 

return maxsum;

}};

空間:o(1)

基本思想:從陣列的第乙個元素開始累加到子串行和,當子串行和大於最大子串行和,則將子串行和賦值給最大子串行和,否則判斷子串行和是否小於0,小於0就將子串行和賦值0。這句話的意思是前面所有序列和為負數的話,就拋棄前面的所有序列,從當前序列重新累加,因為將前面的序列加入會使得和變小。

說明:該演算法乙個附帶的優點是,它只對資料進行一次掃瞄,一旦a[i]被讀入並被處理,它就不再需要被記憶。不僅如此,在任意時刻,演算法都呢個對它已經讀入的書給出子串行問題的正確答案。具有這種性質的演算法叫做聯機演算法(on-line algorithm)。

演算法步驟:

1.乙個迴圈從0到n-1,實現對所有元素的遍歷;

2.將每個元素累加到子串行和,如果子串行和大於最大子串行和,就賦值給最大子串行和,否則判斷子串行和是否小於0,小於0就將子串行和賦值0。

o(n)

long long maxsubsequencesum_4(long  long a, long long n)

return maxsum;

}

求解最大子串行和問題

原題 給定乙個陣列,其中元素有正,也有負,找出其中乙個連續子串行,使和最大 不想說明什麼,我們資料結構老師第一節課就給我們講這個,以前給實現過乙個暴力演算法版的演算法複雜度 o n2 現在實現乙個動態規劃版的 求解最大子串行和問題o n 演算法 param array public static v...

最大子串行和問題的求解

問題描述 給定 可能存在負值 整數a1,a 2.a n,求最大子串行和。如果所有的整數均為負數,則最大子串行和為0.列如 對於輸入 2,11,4,13,5,2,該輸入的最大子串行和為20 11 4 13 現在我們將敘述四個演算法來求解最大子串行和問題。1.該演算法是使用窮舉法來嘗試所有的可能 演算法...

最大子串行和問題的求解

怎麼求出乙個陣列最大的連續累加之和呢?方法有很多,我們目前只講乙個比較不錯的方法,該方法使用了分治遞迴的思想。我們假設下面是我們需要計算的陣列,其中a是游標,我可以知道游標將陣列分成了兩段,最大值有可能出現在前半段也有可能出現在後半段,還有一種情況是跨越a 中間 相加的一段。1,3,5,7 a,9,...