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;
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值