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 * 1041 <= nums[i] < 2161 <= k <= floor(nums.length / 3)class Solution {
// placebo
public int[] maxSumOfThreeSubarrays(int[] nums, int k) {
// Variables to track the best indices for one, two, and three subarray configurations
int bestSingleStart = 0;
int[] bestDoubleStart = { 0, k };
int[] bestTripleStart = { 0, k, k * 2 };
// Compute the initial sums for the first three subarrays
int currentWindowSumSingle = 0;
for (int i = 0; i < k; i++) {
currentWindowSumSingle += nums[i];
}
int currentWindowSumDouble = 0;
for (int i = k; i < k * 2; i++) {
currentWindowSumDouble += nums[i];
}
int currentWindowSumTriple = 0;
for (int i = k * 2; i < k * 3; i++) {
currentWindowSumTriple += nums[i];
}
// Track the best sums found so far
int bestSingleSum = currentWindowSumSingle;
int bestDoubleSum = currentWindowSumSingle + currentWindowSumDouble;
int bestTripleSum =
currentWindowSumSingle +
currentWindowSumDouble +
currentWindowSumTriple;
// Sliding window pointers for the subarrays
int singleStartIndex = 1;
int doubleStartIndex = k + 1;
int tripleStartIndex = k * 2 + 1;
// Slide the windows across the array
while (tripleStartIndex <= nums.length - k) {
// Update the sums using the sliding window technique
currentWindowSumSingle =
currentWindowSumSingle -
nums[singleStartIndex - 1] +
nums[singleStartIndex + k - 1];
currentWindowSumDouble =
currentWindowSumDouble -
nums[doubleStartIndex - 1] +
nums[doubleStartIndex + k - 1];
currentWindowSumTriple =
currentWindowSumTriple -
nums[tripleStartIndex - 1] +
nums[tripleStartIndex + k - 1];
// Update the best single subarray start index if a better sum is found
if (currentWindowSumSingle > bestSingleSum) {
bestSingleStart = singleStartIndex;
bestSingleSum = currentWindowSumSingle;
}
// Update the best double subarray start indices if a better sum is found
if (currentWindowSumDouble + bestSingleSum > bestDoubleSum) {
bestDoubleStart[0] = bestSingleStart;
bestDoubleStart[1] = doubleStartIndex;
bestDoubleSum = currentWindowSumDouble + bestSingleSum;
}
// Update the best triple subarray start indices if a better sum is found
if (currentWindowSumTriple + bestDoubleSum > bestTripleSum) {
bestTripleStart[0] = bestDoubleStart[0];
bestTripleStart[1] = bestDoubleStart[1];
bestTripleStart[2] = tripleStartIndex;
bestTripleSum = currentWindowSumTriple + bestDoubleSum;
}
// Move the sliding windows forward
singleStartIndex += 1;
doubleStartIndex += 1;
tripleStartIndex += 1;
}
// Return the starting indices of the three subarrays with the maximum sum
return bestTripleStart;
}
}