LeetCode805. 數組的均值分割

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