給定的整數數組 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;
}
};