Skip to content

Instantly share code, notes, and snippets.

@rutwick
Last active September 1, 2016 11:20
Show Gist options
  • Save rutwick/bcee3b6d0478bb2fd47e038d6c4e8e11 to your computer and use it in GitHub Desktop.
Save rutwick/bcee3b6d0478bb2fd47e038d6c4e8e11 to your computer and use it in GitHub Desktop.
To calculate 'equilibrium indexes' for arrays. Read comments for details.
<?php
/** Problem found on Codility
* A zero-indexed array A consisting of N integers is given. An equilibrium index of this array is any integer P such that 0 ≤ P < N and the sum of elements of lower indices is equal to the sum of elements of higher indices, i.e.
* A[0] + A[1] + ... + A[P−1] = A[P+1] + ... + A[N−2] + A[N−1]. Sum of zero elements is assumed to be equal to 0. This can happen if P = 0 or if P = N−1.
* For example, consider the following array A consisting of N = 8 elements:
* A[0] = -1, A[1] = 3, A[2] = -4, A[3] = 5, A[4] = 1, A[5] = -6, A[6] = 2, A[7] = 1
* P = 1 is an equilibrium index of this array, because:
* A[0] = −1 = A[2] + A[3] + A[4] + A[5] + A[6] + A[7]
* P = 3 is an equilibrium index of this array, because:
* A[0] + A[1] + A[2] = −2 = A[4] + A[5] + A[6] + A[7]
* P = 7 is also an equilibrium index, because:
* A[0] + A[1] + A[2] + A[3] + A[4] + A[5] + A[6] = 0 and there are no elements with indices greater than 7.
* P = 8 is not an equilibrium index, because it does not fulfill the condition 0 ≤ P < N.
* Write a function:
* function solution($A); that, given a zero-indexed array A consisting of N integers, returns any of its equilibrium indices. The function should return −1 if no equilibrium index exists.
* For example, given array A shown above, the function may return 1, 3 or 7, as explained above.
* Assume that: N is an integer within the range [0..100,000];
* each element of array A is an integer within the range [−2,147,483,648..2,147,483,647].
* Complexity: expected worst-case time complexity is O(N); expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).
* Elements of input arrays can be modified.
*/
function solution($A) {
// write your code in PHP5.5
$sum = 0;
$length = count($A);
$eq = -1;
for($i = 0; $i < $length; $i++) {
if($i == 0) {
$copy = $A;
$end = array_splice($copy, 1, $length - 1);
$sum = array_sum($end);
if($sum == 0) {
$eq = $i;
}
} else if($i == $length - 1) {
$copy = $A;
$begin = array_splice($copy, 0, $length - 1);
$sum = array_sum($begin);
if($sum == 0) {
$eq = $i;
}
} else {
$copy1 = $copy2 = $A;
$pre = array_splice($copy1, 0, $i);
$post = array_splice($copy2, $i + 1, $length - 1);
if(array_sum($pre) == array_sum($post)) {
$eq = $i;
}
}
}
$sum = 0;
return $eq;
}
solution([-1, 3, -4, 5, 1, -6, 2, 1]);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment