最少代价调整数组使出现次数相等 - 优化算法详解
首先统计出每种数在数组中出现的次数,设为 cnt[i],那么每种数出现的理论次数应该是 n/10。
假设我们要将某种数 x 调整到出现 n/10 次,那么需要修改的次数就是 abs(cnt[x] - n/10),因为如果 cnt[x] 小于 n/10,就需要把数组中的其他数修改为 x,如果 cnt[x] 大于 n/10,就需要将 x 修改为其他数。
因此,我们可以枚举将哪种数调整到出现 n/10 次,对于每种数 x,计算出需要修改的代价为 cost[x] = abs(cnt[x] - n/10) * b[x],然后将 cost 数组从小到大排序,从小到大依次选择需要调整的数,并将它们修改为其他数,直到所有数出现的次数都等于 n/10。
具体实现时,可以使用桶排序的思想,将每种数字出现的次数放到对应的桶中,然后遍历桶,统计出需要调整的数的个数和代价。选择代价最小的数进行调整,同时更新桶中的计数和代价,直到所有桶中的计数都等于 n/10。
原文地址: https://www.cveoy.top/t/topic/ndIw 著作权归作者所有。请勿转载和采集!