最大子串行和O(n)階複雜度演算法

2022-09-05 14:27:07 字數 1056 閱讀 3925

問題描述給定整數序列a1,a2, a3,a4,a5,求(ai + a(i+1) +.....aj)的最大值:

int mostson(int arryin,int

len)

else}}

return

most;

}

演算法解釋:確定子串行最大值得關鍵點在於確定序列開始位置和結束位置。

開始位置難以確定,確定開始位置之後每加乙個數字的sum與sum的前值最大的值,直到數列最後乙個元素,即可獲取sum最大的值,和sum最大時結束點的位置。

所以難點在於確定開始位置。

首先分析開始位置的特徵。

例如數列 example[n],的最大子數列為example[s]到example[e]。

既然example[s]+。。。。example[e]最大,故example[s-1] +example[s]+。。。。example[e] < example[s]+。。。。example[e],

所以example[s-1]<0;更進一步example[i] +。。。example[s-1] < 0,0<= i <= s-1。

問題轉化為求最大s,使得example[i] +。。。example[s-1] < 0,(0<= i <= s-1)。

具體思路:

從i= 0;開始sum + = sum +arryin[i],依次累加只要sum的和為正值就繼續累加,

如果sum < 0 ,則sum = 0,arryin[i+1]重新累加直到 i 等於陣列末尾。記下此時sum 累加的開始位即為最大子串行的最大位。

證明:如果sun累加過程中總共進行了n次清零操作,最後一次在s-1處,那麼可以將陣列分成n+1段,前n端累加值群為0,當i 處於子段前後端節點時 必然使得example[i] +。。。example[s-1] < 0,(0<= i <= s-1)。

當i不處於處於子段sub前後端節點時 而是處於子段sub內部節點時,i將子段sub分為前後兩段,sub的累加值<0 ,又因為sub前半段必然》0,所以sub後半段累加值<0,所以example[i] +。。。example[s-1] < 0。至此證明完畢。

求最大子串行的和O(n)演算法複雜度

題目 輸入一組整數,求出這組數字子串行和中的最大值,只要求出最大子串行的和,不必求出最大值對應的序列。最大子串行和 整數序列a1,a2,an 可能有負數 求a1 an的乙個子串行ai aj,使得ai到aj的和最大。例如 序列 2,11,4,13,5,2,5,3,12,9,則最大子串行和為21。序列 ...

時間複雜度和最大子串行問題

執行時間計算 法則1 for迴圈 乙個for迴圈的執行時間最多是該for迴圈內部那些語句 包括測試 的執行時間乘以迭代的次數。法則2 巢狀的for迴圈 從裡向外分析這些迴圈,在一組巢狀迴圈內部的一條語句的執行時間為該語句的執行時間乘以該組所有的for迴圈的大小的乘積。法則3 順序語句 將各個語句的執...

最大子列和(演算法複雜度優化)

include include include define maxk 1e7 clock t start,stop double duration 一種複雜度為o n 3 的暴力解法 int maxsubseqsum1 int a,int n return maxsum 複雜度為o n 2 的演算...