如何通过最多修改k个元素最小化数组任意两元素的最大差值
用至多k次修改最小化数组元素的最大差值
问题描述
给定一个整数数组和整数k,允许修改至多k个元素为任意数值,目标是最小化修改后数组中任意两个元素之间的最大差值。
示例
以数组[4,7,4,7,4]、k=2为例:
- 先将数组排序,得到
[4,4,4,7,7] - 将两个7修改为4,数组变为
[4,4,4,4,4],此时任意两元素的最大差值为0,达到最优结果。
解法思路
基于中位数的修改策略
- 排序数组:先把数组按升序排列,直观呈现元素的分布规律。
- 选取中位数:排序后的数组中位数是中间位置的元素(数组长度为奇数时取正中间元素,偶数时可任选中间两个之一),中位数作为数组的“中心”,能最小化所有元素到它的绝对差总和。
- 计算绝对差值:遍历排序后的数组,计算每个元素与中位数的绝对差值。
- 优先修改差值最大的元素:把与中位数差值最大的元素修改为中位数,直到用完k次修改机会。
这个策略在示例中效果显著:排序后的中位数是4,两个7与中位数的差值为3(是最大的差值),修改这两个元素后数组元素完全一致,最大差值直接降为0。
更通用的滑动窗口解法
如果数组元素分布较为分散,基于中位数的策略可能无法得到全局最优解,此时可以采用滑动窗口法:
- 排序数组后,用滑动窗口覆盖
n - k个连续元素(n为数组总长度)。 - 计算每个窗口内右端元素与左端元素的差值,其中最小的差值就是修改k个元素后的最小最大差值——因为只需将窗口外的k个元素修改为窗口内的数值,此时数组的最大差值就是窗口的区间差值。
举个例子,数组[1,3,6,10]、k=1:
- 排序后数组为
[1,3,6,10] - 可选的滑动窗口有
[1,3,6](差值为5)、[3,6,10](差值为7),最小差值是5,对应把10修改为1-6之间的任意值,修改后数组的最大差值为5。
总结
- 当数组元素集中在中位数附近时,基于中位数的修改策略简单高效,能快速得到最优解。
- 对于元素分布分散的场景,滑动窗口法可以确保找到全局最优的最小最大差值。
内容的提问来源于stack exchange,提问作者user599583
相关产品推荐
相关产品推荐

