805. 數組的均值分割
給定的整數數組 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].
PS:
這個題是求能不能進行平均分組,我們可以把題目轉換成模擬一個組所有的值得和
因爲要求是倆個組得平均值相等,也就是所有人得平均值都要相等
DFS尋找每一次得可能,知道找到
class Solution {
//兩組的平均值相等的話,證明我所有的和的平均值是相等的
public boolean splitArraySameAverage(int[] A) {
int sum = 0;
for (int num : A) {
sum += num;
}
//Asum / len = Bsum / i = Csum / len - i
int len = A.length;
Arrays.sort(A);
for (int i = 1; i <= len / 2; i++) {
if (sum * i % len == 0) {
//是否存在長度爲i 的 sum和爲 sum * i / len B arr
if (dfs(A, i, sum * i / len, 0)){
return true;
}
}
}
return false;
}
private boolean dfs(int[] A, int n, int targetSum, int startIndex) {
if (targetSum == 0 && n == 0) {
return true;
}
if (n != 0) {
for (int i = startIndex; i < A.length; i++) {
if (i > startIndex && A[i] == A[i - 1]) {
continue;
}
if (dfs(A, n - 1, targetSum - A[i], i + 1)) {
return true;
}
}
}
return false;
}
}