Problem
In a given integer array A, we must move every element of A to either list B or list C. (B and C initially start empty.)
Return true if and only if after such a move, it is possible that the average value of B is equal to the average value of C, and B and C are both non-empty.
Example :
Input:
[1,2,3,4,5,6,7,8]
Output: true
Explanation: We can split the array into [1,4,5,8] and [2,3,6,7], and both of them have the average of 4.5.
Note:
- The length of
A
will be in the range [1, 30]. A[i]
will be in the range of[0, 10000]
.
Solution
/**
* @param {number[]} A
* @return {boolean}
*/
var splitArraySameAverage = function(A) {
var sum = A.reduce((last, num) => (last + num), 0);
return find(A, 0, sum, 0, 0);
};
var find = function (A, index, sum, sumB, numB) {
if (index >= A.length) return false;
if (numB > 0 && numB < A.length && sumB / numB === (sum - sumB) / (A.length - numB)) return true;
return find(A, index + 1, sum, sumB, numB) || find(A, index + 1, sum, sumB + A[index], numB + 1);
};
Explain:
nope.
Complexity:
- Time complexity : O(2^n).
- Space complexity : O(1).