Java實現 LeetCode 805 數組的均值分割 (DFS+分析題)

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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章