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:
Write a function:
function solution(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:
function solution(A) {
let sumAll = A.reduce((sum, current) => sum + current, 0);
let temp = 0;
let diff = 0;
for (let i in A) {
temp += A[i];
if (Math.abs(sumAll - temp * 2) < diff || diff === 0) {
diff = Math.abs(sumAll - temp * 2);
}
}
return diff;
}
function solution(A) {
let right = A.reduce((sum, current) => sum + current, 0);
let left = 0;
let diff = 0;
for (let i = 0; i < A.length; i++) {
left += A[i];
right -= A[i];
if (Math.abs(right - left) < diff || diff === 0) {
diff = Math.abs(right - left);
}
}
return diff;
}
function solution(A) {
let right = A.reduce((sum, current) => sum + current, 0);
let left = 0;
let diff = [];
for (let i = 0; i < A.length; i++) {
left += A[i];
right -= A[i];
diff.push(Math.abs(right - left));
}
return Math.min(...diff);
}
function solution(A) {
let right = A.reduce((sum, current) => sum + current);
let left = 0;
let answer = null;
for (let i = 0; i < A.length - 1; i++) {
left += A[i];
right -= A[i];
let diff = Math.abs(left - right);
if (answer === null || answer > diff) {
answer = diff;
}
}
return answer;
}