codility-exercises/tc2.py

79 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
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:
class Solution { public int solution(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].
"""
def solution(A):
size = len(A) - 1
if size == 1:
return abs(A[0] - A[1])
l = [A[0]]
r = [A[-1]]
for i in range(size):
l.append(l[i] + A[i+1])
r.append(r[i] + A[size-i-1])
res = abs(l[0] - r[size-1])
for i in range(1, size):
res = min(res, abs(l[i] - r[size-i-1]))
return res
res = solution([1, 1, 3])
assert res == 1, "got {}".format(res)
res = solution([3, 1, 2, 4, 3])
assert res == 1, "got {}".format(res)
res = solution([-2, -3, -4, -1])
assert res == 0, "got {}".format(res)
res = solution([1, 8, -10, 8, 7, 9, 11])
assert res == 6, "got {}".format(res)
res = solution([-1, 1, 0, 1, -1, 0, -1, 1, -1, 0, 1, 0, 1, -1, 0])
assert res == 0, "got {}".format(res)
res = solution([14, 9])
assert res == 5, "got {}".format(res)