Tape Equilibrium
Task
A non-empty array A consisting of N integers is given. Array A represents numbers on a tape.
Any integer P, such that 0 < P < N, splits this tape into two non-empty parts: A[0], A[1], …, A[P − 1] and A[P], A[P + 1], …, A[N − 1].
The difference between the two parts is the value of: |(A[0] + A[1] + … + A[P − 1]) − (A[P] + A[P + 1] + … + A[N − 1])|
In other words, it is the absolute difference between the sum of the first part and the sum of the second part.
For example, consider array A such that:
A[0] = 3 A[1] = 1 A[2] = 2 A[3] = 4 A[4] = 3
We can split this tape in four places:
- P = 1, difference = |3 − 10| = 7
- P = 2, difference = |4 − 9| = 5
- P = 3, difference = |6 − 7| = 1
- P = 4, difference = |10 − 3| = 7
Write a function:
int solution(vector<int> &A);
that, given a non-empty array A of N integers, returns the minimal difference that can be achieved.
For example, given:
A[0] = 3 A[1] = 1 A[2] = 2 A[3] = 4 A[4] = 3
the function should return 1, as explained above.
Write an efficient algorithm for the following assumptions:
- N is an integer within the range [2..100,000];
- each element of array A is an integer within the range [−1,000..1,000].
Solution
#include <iostream>
using namespace std;
#include <cassert>
#include <limits>
#include <vector>
int solution(vector<int> &A) {
// or P cannot be found
assert(A.size() > 1);
int tot = 0;
for (ulong a = 0; a < A.size(); a++)
tot += A[a];
int lhs = 0;
int rhs = tot;
int minDiff = std::numeric_limits<int>::max();
for (ulong a = 0; a < A.size() – 1; a++) {
lhs += A[a];
rhs -= A[a];
int diff = abs(lhs – rhs);
if (diff < minDiff) {
minDiff = diff;
}
}
return minDiff;
}
Test Function
int main() {
vector<int> v1{3, 1, 2, 4, 3};
assert(solution(v1) == 1);
vector<int> v2{1, 2};
assert(solution(v2) == 1);
vector<int> v3{-1000, 1000};
assert(solution(v3) == 2000);
vector<int> v4{1000, -1000};
assert(solution(v4) == 2000);
vector<int> v5{1000, 1000};
assert(solution(v5) == 0);
vector<int> v6{1, 2, -3};
assert(solution(v6) == 2);
return 0;
}
Results
Correctness | 100% |
Performance | 100% |
Time Complexity | O(N) |