805. 数组的均值分割
805. 数组的均值分割
给定你一个整数数组 nums
我们要将 nums 数组中的每个元素移动到 A 数组 或者 B 数组中,使得 A 数组和 B 数组不为空,并且 average(A) == average(B) 。
如果可以完成则返回true , 否则返回 false 。
注意:对于数组 arr , average(arr) 是 arr 的所有元素的和除以 arr 长度。
- 输入: nums = [1,2,3,4,5,6,7,8]
- 输出: true
- 解释: 我们可以将数组分割为 [1,4,5,8] 和 [2,3,6,7], 他们的平均值都是4.5。
暴力(TLE) 59/111
class Solution {
public:
bool splitArraySameAverage(vector<int>& nums) {
double sum=0;
int flag;
for(auto num:nums) sum+=num;
for(long long int i=1;i<(1<<nums.size())-1;i++){
double temp=0;
int cnt=0;
for(long long int j=0;j<nums.size();j++){
int flag=(i&(1<<j))?1:0;
if(flag){
cnt++;
temp+=nums[j];
}
if((temp/cnt)==(sum-temp)/(nums.size()-cnt)){
//cout<<temp/cnt<<endl;
return true;
}
}
}
return false;
}
};
class Solution {
public:
bool ans;
void dfs(vector<int>&nums,int idx,double sum,double cur,int cnt){
if(idx>nums.size()) return;
if((cnt>=1&&cnt<nums.size())&&(cur/cnt)==(sum-cur)/(nums.size()-cnt)){
ans=true;
return;
}
if(ans) return;
else{
if(idx<nums.size())
dfs(nums,idx+1,sum,cur+nums[idx],cnt+1);
dfs(nums,idx+1,sum,cur,cnt);
}
}
bool splitArraySameAverage(vector<int>& nums) {
double sum=0;
int flag;
for(auto num:nums) sum+=num;
dfs(nums,0,sum,nums[0],1);
return ans;
}
};
折半查找
转化
1.找到前后两部分平均值相同。设前部分和为s1,长度为l1,整个数组和为s,数组长度为l。
题意 s1/l1 = (s-s1)/(l-l1)
=> s1*(l-l1) = (s-s1)*l1
=> s1*l-s1*l1 = s*l1-s1*l1
=> s1*l=s*l1
=> s1/l1 = s/l
转化为,找到一个子数组,使它的均值等于整个数组的均值。
s1*l/l1 -s = 0;
对数组进行处理后,找到一个子数组,满足和为零
折半
将数组分为两部分。对前半部分进行查找记录,并计算子数组和。如果当前和为零,满足题意返回true。否则,对后半部分进行处理。如果满足当前和为前部分的记录的相反数,并且后半部分未遍历完全(即数组二保留至少一个值)。返回true;
class Solution {
public:
bool splitArraySameAverage(vector<int>& nums) {
int sum=0;
int flag;
for(auto num:nums) sum+=num;
int n=nums.size();
if(n==1) return false;
for(auto& num:nums) num=num*n-sum;
set<int>book;
for(int i=1;i<(1<<(n/2));i++){
int t=0;
for(int j=0;j<n/2;j++){
if(i>>j&1){
t+=nums[j];
if(t==0)
return true;
}
book.insert(t);
}
}
int m=n/2;
for(int i=1;i<(1<<(n-m));i++){
int t=0;
for(int j=0;j<(n-m);j++){
if(i>>j&1){
t+=nums[m+j];
if(t==0||((i<(1<<(n-m))-1)&&book.count(-t))){
return true;
}
}
}
}
return false;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具