題目連結:
題目意譯:
給定一個整數陣列 nums 以及一整數 k,回傳該陣列中一個非空子序列的最大可能總和並使得該子序列中每兩個連續整數 nums[i] 和 nums[j],其中 i < j,滿足條件 j - i ≦ k。
一個陣列的一個子序列是藉由在陣列中刪除若干個(或是一個不刪)並使剩餘元素的相對順序不變而得到。
限制:
1 ≦ k ≦ nums.length ≦ 10 ^ 5
-10 ^ 4 ≦ nums[i] ≦ 10 ^ 4
範例測資:
範例 1:
輸入: nums = [10,2,-10,5,20], k = 2
輸出: 37
解釋: 子序列為 [10, 2, 5, 20]。
範例 2:
輸入: nums = [-1,-2,-3], k = 1
輸出: -1
解釋: 子序列必須非空,所以我們選擇當中最大的數字。
範例 3:
輸入: nums = [10,-2,-10,-5,20], k = 2
輸出: 23
解釋: 子序列為 [10, -2, -5, 20]。
解題思維:
如果我們把問題集中在「以索引值 i 作為結尾的子序列」之最大總和,則這個問題的答案可以看到會是以下的最大值
「以索引值 i - 1 作為結尾的子序列」之最大總和
「以索引值 i - 2 作為結尾的子序列」之最大總和
……
「以索引值 i - k 作為結尾的子序列」之最大總和
加上 nums[i] 即可得到(當然,上面提及的每一個子序列都滿足題目提及的索引值條件,不只是結尾兩個元素)。
所以我們可以結合動態規劃(Dynamic Programming)的精神——不知道要做哪個子問題就全做(這次就不寫額外的遞迴式了,因為上面的已經足夠);加上
這題用雙端佇列(Deque)維護一個「視窗」中的最大值(索引值 i - k ~ i 可以視為是一個滑動視窗(Sliding Window))。
而回到最原先的問題,則是每一個「以索引值 i 作為結尾的子序列」之最大總和中的最大值。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。