小美拿到了一个数组,她每次可以进行如下操作: 选择两个元素,一个加 1,另一个减 1。 小美希望若干次操作后,众数的出现次数尽可能多。你能帮她求出最小的操作次数吗? 众数定义:在一组数据中,出现次数最多的数据,是一组数据中的原数据,而不是相应的次数。 一组数据中的众数不止一个,如数据2、3、-1、2、1、3中,2、3都出现了两次,它们都是这组数据中的众数。
第一行为一个正整数 n ,代表数组的大小。 第二行输入 n 个正整数 a_i ,代表小美拿到的数组。 1≤ n ≤ 10^5 1≤ a_i ≤ 10^9
一个整数,代表最小的操作次数。
3 1 4 4
2
3 1 5 5
0
考点:贪心
数据规模 n ≤ 1e5 | 限制 1 秒 / 256MB | 标准输入输出
推荐方向:贪心
本题切入点
加一减一不改变总和,因此众数目标值只能取原数组中的某个值;排序后枚举把哪个值作为众数,用前缀和快速算代价。
每一步都取当前最优,靠问题性质保证局部最优能拼成全局最优。
思路框架(贪心 通法 · 非本题专属)
实现要点:贪心题关键在于排序规则:按什么关键字排序决定了策略是否正确。
复杂度:时间 O(n log n)(含排序) | 空间 O(1) ~ O(n)
该范式的通法易错点
对照本题
样例 1:输入 3 / 1 4 4 → 输出 2
第一次操作:第一个数加 1,第二个数减 1。
第二次操作:第一个数加 1,第三个数减 1。
数组变成[3,3,3],众数出现了 3 次。
样例 2:输入 3 / 1 5 5 → 输出 0
众数出现了 2 次,由于无法再用操作使得众数出现的次数变得更多,所以无需操作。
解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:2023年美团秋招编程岗第二批笔试。