Categories
coding solutions

Codility: TapeEquilibrium Solution

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

The task specifies they want an ‘efficient’ algorithm, which is a code word for best worst-case performance on large data. Summing the values for each pivot value would be O(N2).
The answer is to keep sums of the total to the right and left of the pivot, and update them as you go. This is O(N).
#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

This code tests the solution
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

Correctness100%
Performance100%
Time ComplexityO(N)

Index of solutions to Codility Lessons

Leave a Reply

Your email address will not be published. Required fields are marked *