給定k個整數的序列,其任意連續子串行可表示為,其中 1 <= i <= j <= k。最大連續子串行是所有連續子序中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大連續子串行和即為20。
注:為方便起見,如果所有整數均為負數,則最大子串行和為第乙個元素的值。
解決這樣乙個問題是乙個很有趣的過程,我們可以嘗試著從複雜度比較高的演算法一步一步地推出複雜度較低的演算法。
演算法一:蠻力列舉
每個問題往往都有乙個最直接而魯莽的方法,雖然這樣的方法不是我們最終想要的,但直接有效的方法能啟發我們進一步優化。這裡最直接的方法就是遍歷所有的子陣列,比較每乙個子陣列的和即得到最大的子陣列和。
時間複雜度:o(n^3)
其**:
#include usingnamespace
std;
int maxsubarray(int *a,int
n)
if(currsum>maxsum)
maxsum=currsum;
currsum=0
; }
}return
maxsum;
}int
main()
;
int len=sizeof(a)/sizeof(int
);
int max=maxsubarray(a,len);
cout
return0;
}
演算法二:
時間複雜度:o(n^2)
int maxsubarray1(int*a,intn) }
return
maxsum;
}
對於這種方法,歸根究底還是屬於窮舉法,其間接地求出了所有的連續子串行的和,然後取最大值即可。
那麼,這裡,我們需要對比一下前面兩種演算法,為什麼同樣都是窮舉法,但演算法一的時間複雜度遠高於演算法二的時間複雜度?
演算法二相較於演算法一,其優化主要體現在減少了很多重複的操作。
對於a-b-c-d這樣乙個序列,
演算法一在計算連續子串行和的時候,其過程為:
a-b、a-c、a-d、b-c、b-d、c-d
而對於演算法二,其過程為:
a-b、a-c、a-d、b-c、b-d、c-d
其過程貌似是一樣的,但是演算法一的複雜就在於沒有充分利用前面已經求出的子串行和的值。
舉個例子,演算法一在求a-d連續子串行和的值時,其過程為a-d = a-b + b-c + c-d;
而對於演算法二,a-d連續子串行和的求值過程為a-d = a-c+c-d;
這樣,演算法二充分利用了前面的計算值,這樣就大大減少了計算子串行和的步驟。
最大連續子陣列和
題目描述 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值,要求時間複雜度為o n 例如輸入的陣列為 1,2,3,10,4,7,2,5 和最大的子陣列為 3,10,4,7,2 因此輸出為該子陣列的和18。思路 採用貪婪法...
最大連續子陣列和
輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值,要求時間複雜度為o n 例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因此輸出為該子陣列的和18。第乙個想法肯定就是如果能夠把陣...
最大連續子陣列和
給定乙個整數陣列,元素的值有正有負。定義 連續子陣列和 為連續幾個陣列的元素的和,求最大的連續子陣列和。已知這個值在int能夠表示的範圍內。無腦暴力做就是列舉所有的子陣列,o n 2 然後對於每個子陣列求和,自然就找出最大的了,複雜度總共是o n 3 能否優化?想想 做了重複多餘的事情了?沒錯,就是...