给定的整数数组 A ,我们要将 A数组 中的每个元素移动到 B数组 或者 C数组中。(B数组和C数组在开始的时候都为空)
返回true ,当且仅当在我们的完成这样的移动后,可使得B数组的平均值和C数组的平均值相等,并且B数组和C数组都不为空。
示例:
输入:
[1,2,3,4,5,6,7,8]
输出: true
解释: 我们可以将数组分割为 [1,4,5,8] 和 [2,3,6,7], 他们的平均值都是4.5。
注意:
A 数组的长度范围为 [1, 30].
A[i] 的数据范围为 [0, 10000].
借鉴别人的思路,贴出代码如下
class Solution {
public:
public:
//借鉴
unordered_map<int, int> mm;
vector<int> sums;
bool dfs(vector<int>& A, int n, int target, int cur) { // n为剩余需要找寻的元素的个数
if (n == 0) {
return target == 0;
};
if (sums[A.size()] - sums[cur]<target)
return false;
if (target<0)
return false;
bool ans = dfs(A, n - 1, target - A[cur], cur + 1); // 先在当前位置找寻
if (!ans && A.size() - cur> n) // 当前位置没找到,后移一位继续找
ans = ans || dfs(A, n, target, cur + 1);
return ans;
}
public:
bool splitArraySameAverage(vector<int>& A) {
sort(A.begin(), A.end());
int sum = 0;
int N = A.size();
sums = vector<int>(N + 1, 0);
for (int i = 0; i<N; i++)
sums[i + 1] = sums[i] + A[i];
for (int n : A)
sum += n;
int greaterCount = 0; // 先求大于均值的元素数目
for (auto & num : A) {
if (num * N >= sum)
++greaterCount;
}
if (greaterCount < 2)
return false;
for (int i = 1; 2 * i <= N; i++) {
if (sum*i%N != 0)
continue;
int target = sum*i / N;
if (dfs(A, i, target, 0))
return true;
}
return false;
}
};