給乙個浮點數序列,取最大乘積連續子串的值,例如 -2.5,4,0,3,0.5,8,-1,則取出的最大乘積連續子串為3,0.5,8。也就是說,上述陣列中,3 0.5 8這3個數的乘積30.58=12是最大的,而且是連續的。
此最大乘積連續子串與最大乘積子串行不同,請勿混淆,前者子串要求連續,後者子串行不要求連續。也就是說,最長公共子串(longest commonsubstring)和最長公共子串行(longestcommon subsequence,lcs)是:
更簡略地說,前者(子串)的字元的位置必須連續,後者(子串行lcs)則不必。比如字串「 acdfg 」同「 akdfc 」的最長公共子串為「 df 」,而它們的最長公共子串行lcs是「 adf 」,lcs可以使用動態規劃法解決。
或許,讀者初看此題,可能立馬會想到用最簡單粗暴的方式:兩個for迴圈直接輪詢。
但這種蠻力的方法的時間複雜度為o(n^2),能否想辦法降低時間複雜度呢?
考慮到乘積子串行中有正有負也還可能有0,我們可以把問題簡化成這樣:陣列中找乙個子串行,使得它的乘積最大;同時找乙個子串行,使得它的乘積最小(負數的情況)。因為雖然我們只要乙個最大積,但由於負數的存在,我們同時找這兩個乘積做起來反而方便。也就是說,不但記錄最大乘積,也要記錄最小乘積。
假設陣列為a,直接利用動態規劃來求解,考慮到可能存在負數的情況,我們用maxend來表示以a[i]結尾的最大連續子串的乘積值,用minend表示以a[i]結尾的最小的子串的乘積值,那麼狀態轉移方程為:
maxend = max(max(maxend * a[i], minend * a[i]), a[i]);
minend = min(min(maxend * a[i], minend * a[i]), a[i]);
初始狀態為maxend = minend = a[0]。
publicstatic
double maxproductsubstring(double
a)
return
maxresult;
}
動態規劃求解的方法乙個for迴圈搞定,所以時間複雜度為o(n)。
程式設計之法 面試和演算法心得(最大連續子陣列和)
輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值,要求時間複雜度為o n 例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因此輸出為該子陣列的和18。求乙個陣列的最大子陣列和,我想...
《程式設計之法》 最大連續子陣列和
給定乙個整數陣列,陣列裡可能有正數 負數和零。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。例如,如果輸入的陣列為,那麼和為最大的連續子陣列為,和為18。使用動態規劃的思想。令currsum是以當前元素結尾的最大連續子陣列的和,maxsum是全域性的最大子...
程式設計之法 面試和演算法心得 筆記
一 字串翻轉 三步反轉法,先將兩部分分別反轉,然後再整體反轉。abcdef defabc 1 cbadef 旋轉前一部分 2 cbafed 旋轉後一部分 3 defabc 整個旋轉 那麼將 i am a student.studnet.a am i 也類似。二 字串的包含 a abcxyzlmnop...