Given an integer array nums and an integer k, find three non-overlapping subarrays of length k with maximum sum and return them.
Return the result as a list of indices representing the starting position of each interval (0-indexed). If there are multiple answers, return the lexicographically smallest one.
Example 1:
Input: nums = [1,2,1,2,6,7,5,1], k = 2
Output: [0,3,5]
Explanation: Subarrays [1, 2], [2, 6], [7, 5] correspond to the starting indices [0, 3, 5].
We could have also taken [2, 1], but an answer of [1, 3, 5] would be lexicographically larger.
Example 2:
Input: nums = [1,2,1,2,1,2,1,2,1], k = 2
Output: [0,2,4]
Constraints:
1 <= nums.length <= 2 * 104
1 <= nums[i] < 216
1 <= k <= floor(nums.length / 3)
Solutions
Solution 1: Sliding Window
Thinking
Three non-overlapping length-\(k\) subarrays must maximize the sum and then the lexicographic starts. Triple enumeration is cubic.
Slide three windows together: keep the best first segment and the best pair, then add the current third. The left-to-right order yields the lexicographically smallest starts.
We use a sliding window to enumerate the position of the third subarray, while maintaining the maximum sum and its position of the first two non-overlapping subarrays.
The time complexity is \(O(n)\), where \(n\) is the length of the array \(nums\). The space complexity is \(O(1)\).
Solution 2: Preprocessing Prefix and Suffix + Enumerating Middle Subarray
Thinking
Coupled windows are compact but easy to get wrong. Prefix sums plus \(pre[i]\) (best \(k\)-window on the left) and \(suf[i]\) (best on the right) let us enumerate only the middle start.
We can preprocess to get the prefix sum array \(s\) of the array \(nums\), where \(s[i] = \sum_{j=0}^{i-1} nums[j]\). Then for any \(i\), \(j\), \(s[j] - s[i]\) is the sum of the subarray \([i, j)\).
Next, we use dynamic programming to maintain two arrays \(pre\) and \(suf\) of length \(n\), where \(pre[i]\) represents the maximum sum and its starting position of the subarray of length \(k\) within the range \([0, i]\), and \(suf[i]\) represents the maximum sum and its starting position of the subarray of length \(k\) within the range \([i, n)\).
Then, we enumerate the starting position \(i\) of the middle subarray. The sum of the three subarrays is \(pre[i-1][0] + suf[i+k][0] + (s[i+k] - s[i])\), where \(pre[i-1][0]\) represents the maximum sum of the subarray of length \(k\) within the range \([0, i-1]\), \(suf[i+k][0]\) represents the maximum sum of the subarray of length \(k\) within the range \([i+k, n)\), and \((s[i+k] - s[i])\) represents the sum of the subarray of length \(k\) within the range \([i, i+k)\). We find the starting positions of the three subarrays corresponding to the maximum sum.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\). Here, \(n\) is the length of the array \(nums\).