Skip to content

Commit 5c8ca02

Browse files
authored
Create maximum-sum-of-3-non-overlapping-subarrays.cpp
1 parent b6836fd commit 5c8ca02

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Time: O(n)
2+
// Space: O(n)
3+
4+
class Solution {
5+
public:
6+
vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) {
7+
const auto n = nums.size();
8+
vector<int> accu = {0};
9+
for (const auto& num : nums) {
10+
accu.emplace_back(accu.back() + num);
11+
}
12+
13+
vector<int> left_pos(n);
14+
for (int i = k, total = accu[k] - accu[0]; i < n; ++i) {
15+
if (accu[i + 1] - accu[i + 1 - k] > total) {
16+
left_pos[i] = i + 1 - k;
17+
total = accu[i + 1] - accu[i + 1 - k];
18+
} else {
19+
left_pos[i] = left_pos[i - 1];
20+
}
21+
}
22+
23+
vector<int> right_pos(n, n - k);
24+
for (int i = n - k - 1, total = accu[n] - accu[n - k]; i >= 0; --i) {
25+
if (accu[i + k] - accu[i] > total) {
26+
right_pos[i] = i;
27+
total = accu[i + k] - accu[i];
28+
} else {
29+
right_pos[i] = right_pos[i + 1];
30+
}
31+
}
32+
33+
vector<int> result(3);
34+
for (int i = k, max_sum = 0; i <= n - 2 * k; ++i) {
35+
auto left = left_pos[i - 1], right = right_pos[i + k];
36+
auto total = (accu[i + k] - accu[i]) +
37+
(accu[left + k] - accu[left]) +
38+
(accu[right + k] - accu[right]);
39+
if (total > max_sum) {
40+
max_sum = total;
41+
result = {left, i, right};
42+
}
43+
}
44+
return result;
45+
}
46+
};

0 commit comments

Comments
 (0)