689. Maximum Sum of 3 Non-Overlapping Subarrays
https://leetcode.com/problems/maximum-sum-of-3-non-overlapping-subarrays/
/*
* @lc app=leetcode id=689 lang=cpp
*
* [689] Maximum Sum of 3 Non-Overlapping Subarrays
*/
// @lc code=start
class Solution {
public:
vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) {
const int N = nums.size();
vector<int> sums(N + 1, 0), left(N, 0), right(N, N - k), res;
for (int i = 1; i <= N; ++i) sums[i] = sums[i - 1] + nums[i - 1];
for (int i = k, mx_sum = sums[k]; i < N; ++i) {
if (sums[i + 1] - sums[i + 1 - k] > mx_sum) {
left[i] = i + 1 - k;
mx_sum = sums[i + 1] - sums[i + 1 - k];
} else left[i] = left[i - 1];
}
for (int i = N - k - 1, mx_sum = sums[N] - sums[N - k]; i >= 0; --i) {
if (sums[i + k] - sums[i] >= mx_sum) {
right[i] = i;
mx_sum = sums[i + k] - sums[i];
} else right[i] = right[i + 1];
}
for (int i = k, mx_sum = 0; i <= N - 2 * k; ++i) {
const int l = left[i - 1], r = right[i + k], s = (sums[l + k] - sums[l]) + (sums[i + k] - sums[i]) + (sums[r + k] - sums[r]);
if (s > mx_sum) {
mx_sum = s;
res = {l, i, r};
}
}
return res;
}
};
// @lc code=end
Last updated