最大子陣我問這個了在CS.SE,但沒有得到迴應。與長度約束
我最近面臨以下面試問題:
給定一個數組A和整數k,找到與 最大總和的連續子陣列,與所添加的約束此子陣列具有長度在最k。
所以,如果A=[8, -1, -1, 4, -2, -3, 5, 6, -3]
那麼我們得到以下答案爲k
不同的值:
+---+------------------------------+
| k | subarray |
+---+------------------------------+
| 1 | [8] |
| 7 | [5,6] |
| 8 | [8, -1, -1, 4, -2, -3, 5, 6] |
+---+------------------------------+
如果n
是數組A
的長度,然後用修改的優先級隊列,我能及時回答這個問題O(n lgk)
;有沒有辦法將此改進爲O(n)
?請注意,當k = n時,Kadane的算法在O(n)
時間內運行。
如果你限制你保持與K跟蹤數組的大小如何Kadane的算法失敗? –
@ G.Bach:當k = 7時,試着爲問題中的數組做準備。當你到達'5'時,最後一個數組結尾是'[8,-1,-1,4,-2,-3,5]'。但是,當你移動到'6'時,你需要放下'8';這會導致連鎖反應降低'-1,-1,4,-2,-3',因爲長度最大的子陣列最多7個,結束於'6',是'[5,6]'。換句話說,當你走陣列時,你需要跟蹤哪些元素「掉落」,而一個天真的實現導致時間與n * k成比例。 –
你確定?你會有兩個指針,一個左邊一個右邊,每個都會遍歷數組一次,不是嗎? –