题目链接:805. 数组的均值分割 (借用思路来自leetode大佬heren1229 - 力扣(LeetCode))
题目要求将nums分为两个数组A和B,且A和B的平均数相等,那么就可以得出A和B的平均数与nums的数组相等,可以将所有数-平均数,得出一个数组,且数组的和为0。为了避免浮点数,可以将所有数*nums.length()。将数组一分为二,分别计算两个数组形成的和,查看是否有相反数。若有相反数,则说明当前两个数组的数加起来可以为0,则
class Solution {
//默认为false
boolean ans=false;
Map<Integer,Integer> map=new HashMap<>();
public boolean splitArraySameAverage(int[] nums) {
int sum=0;
//计算所有值的总和
for (int num : nums) {
sum += num;
}
for (int i = 0; i < nums.length; i++) {
nums[i]=nums[i]*nums.length-sum;
}
System.out.println(Arrays.toString(nums));
//二分法进行操作
dfs(nums,0,nums.length/2+1,0,0);
dfs(nums,nums.length/2+1,nums.length,0,0);
return ans;
}
void dfs(int[] nums,int left,int right,int sum,int cnt){
//前一半用于插表
if (left<=nums.length/2){
map.put(sum,cnt);
}
//后一半用于查表
if (left>nums.length/2&&map.containsKey(-sum)&&map.get(-sum)+cnt!=0&&map.get(-sum)+cnt!=nums.length){
ans=true;
}
if (ans){
}else if (left<right){ //背包问题,选与不选
dfs(nums,left+1,right,sum+nums[left],cnt+1);
dfs(nums,left+1,right,sum,cnt);
}
}
}
这道题我一开始也是无从下手的,看到大佬heren1229 - 力扣(LeetCode)的代码思路才明白可以这样子做。