專欄 | 九章算法程序員
網址 | http://www.jiuzhang.com面試
題目描述算法
給定一串數列,求出3個互相不覆蓋的長度爲k的子串,使其數字總和爲最大值。輸出的值爲三個子串的起始下標。若是有多種解,輸出字典序最小的一組微信
樣例:app
輸入:[1,2,1,2,6,7,5,1],2 輸出:[0,3,5]優化
解題思路分析3d
首先預處理前綴和,使sum[i]表明以第i個數結尾的長度爲k的子串和,方便咱們以後的計算某個區間的和。code
最樸素的方法是對三段的起始位置進行遍歷,求和,時間複雜度是O(n^3)。cdn
那麼如何優化呢?blog
咱們先不考慮下標,只考慮答案最大**。**若是已知前n個字符中符合題意描述「互相不覆蓋的長度爲k的子串」的1串最大和爲sum_max,那麼咱們加上當前串的值value,就組成了前n+1個串中符合題意描述的2串最大和,爲sum_max+value。
所以,對於第i個位置的求和,咱們考慮從[0,i-k]的狀態轉移,在已知的子串和中加入新的子串,求得從起始到i位的兩串最大值。同理,若是咱們從後往前作相同處理,能夠獲得從後往前的i位兩串最大值。
換言之,能夠考慮將它劃分爲三個區域[0,i-k] [i,i+k-1][i+k,len),咱們只須要枚舉中間的sum[i],早預處理從左到當前位置的最大前綴和,從右到當前位置的最大後綴和,加起來就一定是當前位置能找到的最大和,遍歷一遍就能取得最終解。
參考程序
參考程序給出的left和right分別記錄從左到第i位和從右到第i位的最大sum的下標,由於題意要字典序最小,因此在更新right的時候注意符號。
http://www.jiuzhang.com/solution/maximum-sum-of-3-non-overlapping-subarrays/
面試官角度分析
本題是一道中等難度的題目,主要考察對動態規劃的應用和利用預處理進行優化和節省空間,若是可以想出動態規劃的解法,那此題就能夠獲得hire的評分。
lintcode相關問題