【Leetcode】805. Split Array With Same Average
创始人
2024-02-22 13:30:51
0

题目地址:

https://leetcode.com/problems/split-array-with-same-average/description/

给定一个长nnn数组AAA,A[i]≥0A[i]\ge 0A[i]≥0。问是否能将其划分为两个非空子集,使得两个子集的平均数相等。n≤30,A[i]≤104n\le 30, A[i]\le 10^4n≤30,A[i]≤104。

设划分的两个子集分别为B,CB,CB,C,则有∑B∣B∣=∑C∣C∣=∑B+∑C∣B∣+∣C∣=∑A∣A∣\frac{\sum B}{|B|}=\frac{\sum C}{|C|}=\frac{\sum B+\sum C}{|B|+|C|}=\frac{\sum A}{|A|}∣B∣∑B​=∣C∣∑C​=∣B∣+∣C∣∑B+∑C​=∣A∣∑A​而∑A∣A∣\frac{\sum A}{|A|}∣A∣∑A​与划分无关,所以我们其实就是要求是否存在一个子集,其平均值等于∑A∣A∣\frac{\sum A}{|A|}∣A∣∑A​。考虑新数组B[i]=A[i]−∑A∣A∣B[i]=A[i]-\frac{\sum A}{|A|}B[i]=A[i]−∣A∣∑A​,那么问题即转化为问BBB数组是否存在和为000的非平凡子集(非平凡的意思是不能为空,也不能为BBB自己)。为了避免处理浮点数,我们可以将BBB乘以一个系数,使其每个数都为整数。
这个是背包问题,通常来讲,这种题目可以用动态规划做,但此题的数据范围较为特殊,nnn较小,而A[i]A[i]A[i]的范围较大,如果用动态规划容易爆空间。可以考虑用双向DFS来做,参考https://blog.csdn.net/qq_46105170/article/details/115587834。具体思路是,我们先考虑前n/2n/2n/2个数,进行DFS,用哈希表存一下其所有子集的和以及每个子集的元素个数(这是为了排除掉平凡子集),如果前n/2n/2n/2个数就已经有非平凡子集和为000了,那就说明有解,可以提前结束;否则再暴力DFS后n/2n/2n/2个数的每个子集的和sss,看哈希表是否存在−s-s−s并且元素个数总和大于000小于nnn,如果是,则有解。暴力枚举完毕没发现解,则无解。代码如下:

class Solution {public:bool splitArraySameAverage(vector &A) {int sum = 0;for (int x : A) sum += x;int g = gcd(sum, A.size());int a = sum / g, b = A.size() / g;for (int &x : A) x = x * b - a;unordered_map mp;return dfs1(0, 0, 0, A, mp) || dfs2(A.size() / 2, 0, 0, A, mp);}bool dfs2(int u, int cnt, int sum, vector &A,unordered_map &mp) {auto it = mp.find(-sum);if (it != mp.end() && it->second + cnt && it->second + cnt < A.size())return true;for (int i = u; i < A.size(); i++)if (dfs2(i + 1, cnt + 1, sum + A[i], A, mp)) return true;return false;}// 统计前一半的数的每个子集的和以及元素个数bool dfs1(int u, int cnt, int sum, vector &A,unordered_map &mp) {if (!sum && cnt && cnt < A.size()) return true;auto it = mp.find(sum);if (it == mp.end() || it->second > cnt) mp[sum] = cnt;for (int i = u; i < A.size() / 2; i++)if (dfs1(i + 1, cnt + 1, sum + A[i], A, mp)) return true;return false;}int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
};

时间复杂度O(2n/2+1)O(2^{n/2+1})O(2n/2+1),空间O(2n/2)O(2^{n/2})O(2n/2)。

相关内容

热门资讯

投资小项目加盟代理商(创业加盟... 随着社会的发展和生活水平的提高,生活的压力越来越大。朝九晚六为老板打工并不能完全满足生活条件,所以很...
30个农村办厂项目,200元创... 随着新农村的建设,国家投入了人力物力来振兴最美丽的农村。鼓励年轻人回国创业,大学毕业后到大城市工作,...
爱尔眼科上市首日市值,爱尔眼科... 国内私立眼科医院中,爱尔眼科不是最早的,但却是真正意义上最快的。数据显示,2020年第三季度扣除的非...
邱县:电商直播激活产业发展新动... 转自:邯郸日报 主播在陈村乡电商直播间展示产品。 胡文卿 摄 本报记者 李天一 ...
开个零食店利润高吗,网上开零食... 走在街上,看着过去整条街上的很多店铺,要么标着“转让”的字样,要么换店牌的频率越来越快,要么就倒闭了...
马斯克在社交媒体上表示“美国党... 转自:新华网新华社洛杉矶7月5日电(记者黄恒)美国亿万富翁埃隆·马斯克当地时间5日在社交媒体上发布消...
适合乡镇开的实体店,适合农村开... 在乡镇开店关键看是什么乡镇。浙江和安徽的乡镇不是一回事。然后就是南方或者北方,地域差异往往很大!北方...
阿里巴巴市值多少亿美元2021... 周四(5月13日)美股交易前,【年报分析】阿里巴巴集团发布了第四季度及2020-2021财年全年的年...
没学历学点什么好,想自己开店学... 热门专业和冷门专业对高三的家长和学生肯定更有吸引力。当然,热门专业是很多学生在填报志愿时喜欢知道的专...
零件加工厂加盟,小型代加工厂加... 最近有很多粉丝私信我,想了解一些农村加工项目。很多人可能明白,加工项目是安全无忧的。其实里面坑很多,...