题目描述
给定你一个整数数组 nums
我们要将 nums 数组中的每个元素移动到 A 数组 或者 B 数组中,使得 A 数组和 B 数组不为空,并且 average(A) == average(B) 。
如果可以完成则返回true , 否则返回 false 。
注意:对于数组 arr , average(arr) 是 arr 的所有元素除以 arr 长度的和。
示例 1:
输入: nums = [1,2,3,4,5,6,7,8]
输出: true
解释: 我们可以将数组分割为 [1,4,5,8] 和 [2,3,6,7], 他们的平均值都是4.5。
示例 2:
输入: nums = [3,1]
输出: false
提示:
1 <= nums.length <= 30
0 <= nums[i] <= 104
求解思路&&实现代码
class Solution {
public boolean splitArraySameAverage(int[] A) {
int len = A.length;
int sum = 0;//sum为总和
for(int i = 0; i < len; i++){
sum += A[i];
}
Arrays.sort(A);
for(int i = 1; i <= len/2; i++){
//能否整除
int remainder = sum * i % len;
//目标和
int target = sum * i / len;
//如果从0位置开始,i个数字,满足target 直接返回true,否则,继续循环判断
if(remainder == 0 && dfs(A,0,i,target))
return true;
}
return false;
}
public boolean dfs(int[] A, int index, int cnt, int target){
//如果cnt为0,并且target的值为0
if(cnt == 0)
return target == 0;
//当前的结果已经超过target
if(target < cnt * A[index])
return false;
for(int i = index; i <= A.length - cnt; i++){
//略去重复的情况,缩短运行时间
if(i > index && A[i] == A[i-1]) continue;
if(dfs(A, i+1, cnt-1, target- A[i]))
return true;
}
return false;
}
}