Google 面試題 | 3個非重複子陣列最大和

九章演算法發表於2018-03-08

專欄 | 九章演算法

網址 | http://www.jiuzhang.com

題目描述

給定一串數列,求出3個互相不覆蓋的長度為k的子串,使其數字總和為最大值。輸出的值為三個子串的起始下標。如果有多種解,輸出字典序最小的一組

樣例:

輸入:[1,2,1,2,6,7,5,1],2     輸出:[0,3,5]

解題思路分析

首先預處理字首和,使sum[i]代表以第i個數結尾的長度為k的子串和,方便我們之後的計算某個區間的和。

最樸素的方法是對三段的起始位置進行遍歷,求和,時間複雜度是O(n^3)。

那麼如何優化呢?

我們先不考慮下標,只考慮答案最大**。**如果已知前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],早預處理從左到當前位置的最大字首和,從右到當前位置的最大字尾和,加起來就必定是當前位置能找到的最大和,遍歷一遍就能取得最終解。

參考程式

image

參考程式給出的left和right分別記錄從左到第i位和從右到第i位的最大sum的下標,因為題意要字典序最小,所以在更新right的時候注意符號。

http://www.jiuzhang.com/solution/maximum-sum-of-3-non-overlapping-subarrays/

面試官角度分析

本題是一道中等難度的題目,主要考察對動態規劃的應用和利用預處理進行優化和節省空間,如果能夠想出動態規劃的解法,那此題就可以得到hire的評分。

lintcode相關問題

image

www.lintcode.com/zh-cn/probl…

image

www.lintcode.com/zh-cn/probl…

image
珠鏈動態分割線
歡迎關注我的微信公眾號:九章演算法(ninechapter)。
精英程式設計師交流社群,定期釋出面試題、面試技巧、求職資訊等
2d09fefd332a1a68bb1c.jpeg

相關文章