forked from wisdompeak/LeetCode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path689.Maximum-Sum-of-3-Non-Overlapping-Subarrays.cpp
71 lines (66 loc) · 1.83 KB
/
689.Maximum-Sum-of-3-Non-Overlapping-Subarrays.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
class Solution {
public:
vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k)
{
int N=nums.size();
vector<int>Sum(N);
Sum[0]=nums[0];
for (int i=1; i<N; i++)
Sum[i]=Sum[i-1]+nums[i];
vector<int>LeftSum(N);
vector<int>LeftIdx(N);
int Ksum=0;
for (int i=0; i<k; i++)
Ksum+=nums[i];
LeftSum[k-1]=Ksum;
LeftIdx[k-1]=k-1;
for (int i=k; i<N; i++)
{
Ksum+=nums[i];
Ksum-=nums[i-k];
if (Ksum>LeftSum[i-1])
{
LeftSum[i]=Ksum;
LeftIdx[i]=i;
}
else
{
LeftSum[i]=LeftSum[i-1];
LeftIdx[i]=LeftIdx[i-1];
}
}
vector<int>RightSum(N);
vector<int>RightIdx(N);
Ksum=0;
for (int i=N-1; i>=N-k; i--)
Ksum+=nums[i];
RightSum[N-k]=Ksum;
RightIdx[N-k]=N-k;
for (int i=N-k-1; i>=0; i--)
{
Ksum+=nums[i];
Ksum-=nums[i+k];
if (Ksum>RightSum[i+1])
{
RightSum[i]=Ksum;
RightIdx[i]=i;
}
else
{
RightSum[i]=RightSum[i+1];
RightIdx[i]=RightIdx[i+1];
}
}
int temp=INT_MIN;
vector<int>result(3);
for (int i=k; i<=N-k-1; i++)
{
if (LeftSum[i-1]+Sum[i+k-1]-Sum[i-1]+RightSum[i+k]>temp)
{
temp = LeftSum[i-1]+Sum[i+k-1]-Sum[i-1]+RightSum[i+k];
result = {LeftIdx[i-1]-k+1,i,RightIdx[i+k]};
}
}
return result;
}
};