I came across this problem in Codility tutorials, here is a description:
Given a non-empty null-indexed array A, consisting of N integers.
A triplet (X, Y, Z), such that 0 ≤ X <Y <Z <N, is called a double slice.
The double cut sum (X, Y, Z) is the sum of A [X + 1] + A [X + 2] + ... + A [Y - 1] + A [Y + 1] + A [Y + 2] + ... + A [Z - 1].
For example, an array A such that:
A[0] = 3
A[1] = 2
A[2] = 6
A[3] = -1
A[4] = 4
A[5] = 5
A[6] = -1
A[7] = 2
contains the following examples of double fragments:
double slice (0, 3, 6), the sum is 2 + 6 + 4 + 5 = 17,
double slice (0, 3, 7), the sum is 2 + 6 + 4 + 5 - 1 = 16,
double slice (3, 4, 5), the sum is 0.
The goal is to find the maximum amount of any double fragment.
Write a function:
int solution (vector & A);
- A, N , .
, :
A[0] = 3
A[1] = 2
A[2] = 6
A[3] = -1
A[4] = 4
A[5] = 5
A[6] = -1
A[7] = 2
17, A 17.
, :
N - [3,00,000];
A [-10,000..10,000].
:
- O (N);
- O (N), ( > , ).
.
MaxSum, i, , . , MaxSum, i, 0..i. :
int solution(vector<int> &A) {
int n = A.size();
int end = 2;
int ret = 0;
int sum = 0;
int min = A[1];
while (end < n-1)
{
if (A[end] < min)
{
sum = max(0, sum + min);
ret = max(ret, sum);
min = A[end];
++end;
continue;
}
sum = max(0, sum + A[end]);
ret = max(ret, sum);
++end;
}
return ret;
}
, !