Algorithm
Problem Name: 805. Split Array With Same Average
You are given an integer array nums.
You should move each element of nums into one of the two arrays A and B such that A and B are non-empty, and average(A) == average(B).
Return true if it is possible to achieve that and false otherwise.
Note that for an array arr, average(arr) is the sum of all the elements of arr over the length of arr.
Example 1:
Input: nums = [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 an average of 4.5.
Example 2:
Input: nums = [3,1] Output: false
Constraints:
1 <= nums.length <= 300 <= nums[i] <= 104
Code Examples
#1 Code Example with C++ Programming
Code -
C++ Programming
start coding...
class Solution {
public:
bool splitArraySameAverage(vector<int>& A) {
int sum = 0, n = A.size();
for (int& x: A) {
sum += x;
}
sort(A.rbegin(), A.rend());
for (int i = 1; i < = n/2; ++i) {
if (sum*i%n == 0 && dfs(A, 0, i, sum*i/n, n)) {
return true;
}
}
return false;
}
bool dfs(vector<int>& A, int pos, int count, int target, int& n) {
if (count == 0) {
return target == 0;
}
if (pos == n || target > A[pos] * count) {
return false;
}
for (int i = pos; i < n; ++i) {
if (target >= A[i] && dfs(A, i + 1, count - 1, target - A[i], n)) {
return true;
}
}
return false;
}
};
Copy The Code &
Try With Live Editor
Input
Output
#2 Code Example with Javascript Programming
Code -
Javascript Programming
const splitArraySameAverage = function(A) {
const totalSum = A.reduce((ac, el) => ac + el, 0)
const len = A.length
const mid = Math.floor(len / 2)
A.sort((a, b) => b - a)
for (let i = 1; i < = mid; i++) {
if ((totalSum * i) % len === 0 && combinationSum(A, 0, i, (totalSum * i) / len)) return true
}
return false
}
function combinationSum(nums, idx, k, target) {
if (target > k * nums[idx]) return false
if (k === 0) return target === 0
for (let i = idx; i < nums.length - k; i++) {
if (nums[i] <= target && combinationSum(nums, i + 1, k - 1, target - nums[i])) return true
}
return false
}
Copy The Code &
Try With Live Editor
Input
Output
#3 Code Example with Python Programming
Code -
Python Programming
class Solution:
def splitArraySameAverage(self, A):
def find(target, k, i):
if (target,k) in not_found and not_found[(target,k)] <= i: return False
if k == 0: return target == 0
if k + i > len(A): return False
res = find(target - A[i], k - 1, i + 1) or find(target, k, i + 1)
if not res: not_found[(target, k)] = min(not_found.get((target, k), n), i)
return res
not_found = dict()
n, s = len(A), sum(A)
return any(find(s * i / n, i, 0) for i in range(1, n // 2 + 1) if s * i % n == 0)
Copy The Code &
Try With Live Editor
Input
Output