【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)。

相关内容

热门资讯

留学生教育的国际经验与启示 随着我国综合国力不断提升和共建“一带一路”倡议的持续推进,国内高校吸引来华留学生的数量和质量也在不断...
鲁信创投涨2.02%,成交额3... 5月14日,鲁信创投盘中上涨2.02%,截至13:37,报12.13元/股,成交3105.32万元,...
汤姆猫涨2.12%,成交额5.... 5月14日,汤姆猫盘中上涨2.12%,截至13:44,报5.30元/股,成交5.02亿元,换手率2....
比亚迪亲自下场,欲分食这个年保... 筹备良久,比亚迪(002594.SZ)旗下弗迪电池对两轮、三轮车展开攻势。第一财经记者获悉,5月17...
这样鲜活的地方小戏里印刻着湖湘... 转自:央视网央视网消息: 湖南花鼓戏是一种极具地方色彩的小戏,语言的生活气息浓厚,曲调优美动人。它源...
凌志软件涨2.08%,成交额8... 5月14日,凌志软件盘中上涨2.08%,截至13:40,报14.22元/股,成交8620.34万元,...
崔登荣成为国家游泳队总教练 来源:中国体育报 5月14日,全国游泳项目训练工作会议在深圳召开,会议宣布了崔登荣为国家游泳队新周期...
苹果入局脑机接口赛道,用意念控... 据财联社援引媒体报道,苹果正在进军脑机接口领域,推出了一项新技术,有朝一日可能会彻底改变人类与设备的...
港股概念追踪|券商板块盈利能力...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! 记者调研发现,在境内...
安居宝涨2.18%,成交额38... 5月14日,安居宝(维权)盘中上涨2.18%,截至13:41,报4.68元/股,成交3836.27万...
地标名品助力乡村振兴大会在浙江... 近日,“品牌 让世界更美好”2025世界品牌莫干山大会系列活动在浙江省德清县举行。  在5月11日下...
三大股指均涨超1%,中国人保涨... 每经AI快讯,5月14日,三大股指均涨超1%,保险股爆发,中国人保涨停,中国太保涨超9%,新华保险、...
海航控股涨2.21%,成交额3... 5月14日,海航控股盘中上涨2.21%,截至13:43,报1.39元/股,成交3.39亿元,换手率0...
A股和港股机构投资变阵:聚焦科... 21世纪经济报道特约记者 庞华玮 广州报道据21世纪经报道记者了解,近日《中美日内瓦经贸会谈联合声明...
保定以样板工程推进减污降碳试点... 转自:中国环境网“保定市以入选国家首批减污降碳协同创新试点城市为契机,统筹推进经济社会高质量发展与生...
正帆科技与华茂能联达成战略合作 每经AI快讯,2025年5月9日上海,上海正帆科技股份有限公司与深圳华茂能联科技有限公司(华茂能联)...
青海达日县总工会举办职工手工牦... 转自:中工网原标题:青海达日县总工会举办职工手工牦牛绒编织技能培训班工人日报-中工网记者邢生祥5月1...
国网汝州市供电公司:多举措守护... 来源:环球网 5月12日,国网汝州市供电公司运维人员对35千伏甄大线路#24杆地质灾害隐患点开展现场...
大行评级|瑞银:下调华虹半导体... 瑞银发表报告指,华虹半导体的股价在过去一年已上升46%,相信主要是由于对中国本地化的乐观情绪增加,及...
官宣:崔登荣任国家游泳队总教练 @中国体育报今日,全国游泳项目训练工作会议在深圳召开,会议宣布了崔登荣为国家游泳队新周期的总教练。会...