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

2021-09-11 09:08:11 字數 1381 閱讀 8401

專欄 | 九章演算法

** |

題目描述

給定一串數列,求出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],早預處理從左到當前位置的最大字首和,從右到當前位置的最大字尾和,加起來就必定是當前位置能找到的最大和,遍歷一遍就能取得最終解。

參考程式

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

面試官角度分析

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

lintcode相關問題

珠鏈動態分割線

精英程式設計師交流社群,定期發布面試題、面試技巧、求職資訊等

15個google面試題

1 村子裡有100對夫妻,其中每個丈夫都瞞著自己的妻子 村里的每個妻子都能立即發現除自己丈夫之外的其他男人是否 唯獨不知道她自己的丈夫到底有沒有 村里的規矩不容忍通姦。任何乙個妻子,一旦能證明自己的男人 就必須當天把他殺死。村里的女人全都嚴格照此規矩辦事。一天,女頭領出來宣布,村里至少有乙個丈夫 請...

140個Google的面試題

某獵頭收集了140多個google的面試題,都張到他的blog中了,主要是下面這些職位的,因為被牆,且無任何敏感資訊,所以,我原文搬過來了。這篇blog例舉了google用來面試下面這幾個職位的面試題。很多不是很容易回答,不過都比較經典與 是google,microsoft,amazon之類的公司的...

15個Google面試題以及答案

1 村子裡有100對夫妻,其中每個丈夫都瞞著自己的妻子 村里的每個妻子都能立即發現除自己丈夫之外的其他男人是否 唯獨不知道她自己的丈夫到底有沒有 村里的規矩不容忍通姦。任何乙個妻子,一旦能證明自己的男人 就必須當天把他殺死。村里的女人全都嚴格照此規矩辦事。一天,女頭領出來宣布,村里至少有乙個丈夫 請...