[LeetCode] 1191. K-Concatenation Maximum Sum K次串聯后最大子數組之和



Given an integer array arr and an integer k, modify the array by repeating it k times.

For example, if arr = [1, 2] and k = 3 then the modified array will be [1, 2, 1, 2, 1, 2].

Return the maximum sub-array sum in the modified array. Note that the length of the sub-array can be 0 and its sum in that case is 0.

As the answer can be very large, return the answer modulo 109 + 7.

Example 1:

Input: arr = [1,2], k = 3
Output: 9

Example 2:

Input: arr = [1,-2,1], k = 5
Output: 2

Example 3:

Input: arr = [-1,-2], k = 7
Output: 0

Constraints:

  • 1 <= arr.length <= 10^5
  • 1 <= k <= 10^5
  • -10^4 <= arr[i] <= 10^4

這道題給了一個數組 arr 和一個正整數k,說是數組可以重復k次,讓找出最大的子數組之和。提到求子數組之和,那么肯定首推卡達內算法 Kadane's Algorithm,在之前的題目 Maximum SubarrayMaximum Subarray Sum with One Deletion 中也有應用到。但是你以為就是直接將數組重復k次,在新的大數組中直接用 Kadane 算法么,那就 Naive 了,好歹這也是道 Medium 的題目,得尊重一下。看一下數組長度和k值的范圍,overflow 和 TLE 在向你招手,那該怎么辦呢?還是來分析一下題目中的例子吧,例子1中數組全是正數,則最大和的子數組就是其本身,那么重復幾次,就要都加上,就是原數組所有數字之和再乘以k。例子2中由於有負數存在,所以最大和只是某個子數組,這里就是單獨的一個1,但是一旦可以重復了,那么首尾的1就可以連在一起,形成一個和為2的子數組了,但也不是連的越多越好,只有有首尾相連才可能使得正數相連,所以最多連2個就行了,因為這里整個數組之和為0,連再多跟沒連一樣。但如果把數組變為 [1,-2,2] 的話,那就不一樣了,雖然說兩個為 [1,-2,2,1,-2,2] 的最大子數組之和為3,但是由於原數組之和為1,只要盡可能多的連,就可以得到更大的值,所以這種情況也要考慮到。例子3中數組全是負數,則不管重復多少次,還是取空數組和為0。不得不說本題的例子給的不錯,基本覆蓋了大部分的情況,而且通過分析也大概可以得出解題思路了,就是根據k的大小,若等於1,則對原數組用 Kadane 算法,若大於1,則只拼接一個數組,那么這里就可以用 min(k, 2) 來合並這兩種情況,不過在取數的時候,要用 arr[i % n] 來避免越界,這樣就可以得到最大子數組之和了,不過這也還是針對 k 小於等於2的情況,對於 k 大於2的情況,還是要把減去2剩余的次數乘以整個數組之和的值加上,再一起比較,這樣最終的結果就是三者之中的最大值了,參見代碼如下:


class Solution {
public:
    int kConcatenationMaxSum(vector<int>& arr, int k) {
        int res = INT_MIN, curSum = 0, n = arr.size(), M = 1e9 + 7;
        long total = accumulate(arr.begin(), arr.end(), 0);
        for (int i = 0; i < n * min(k, 2); ++i) {
            curSum = max(curSum + arr[i % n], arr[i % n]);
            res = max(res, curSum);
        }
        return max<long>({0, res, total * max(0, k - 2) + res}) % M;
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/1191


類似題目:

Maximum Subarray

Maximum Subarray Sum with One Deletion


參考資料:

https://leetcode.com/problems/k-concatenation-maximum-sum/

https://leetcode.com/problems/k-concatenation-maximum-sum/discuss/382885/Short-and-concise-O(N)-C%2B%2B-solution

https://leetcode.com/problems/k-concatenation-maximum-sum/discuss/382350/Java-Solution(Kadens-Algo)-with-Explanation


LeetCode All in One 題目講解匯總(持續更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM