You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过最多修改k个元素最小化数组任意两元素的最大差值

用至多k次修改最小化数组元素的最大差值

问题描述

给定一个整数数组和整数k,允许修改至多k个元素为任意数值,目标是最小化修改后数组中任意两个元素之间的最大差值。

示例

以数组[4,7,4,7,4]、k=2为例:

  • 先将数组排序,得到[4,4,4,7,7]
  • 将两个7修改为4,数组变为[4,4,4,4,4],此时任意两元素的最大差值为0,达到最优结果。

解法思路

基于中位数的修改策略

  1. 排序数组:先把数组按升序排列,直观呈现元素的分布规律。
  2. 选取中位数:排序后的数组中位数是中间位置的元素(数组长度为奇数时取正中间元素,偶数时可任选中间两个之一),中位数作为数组的“中心”,能最小化所有元素到它的绝对差总和。
  3. 计算绝对差值:遍历排序后的数组,计算每个元素与中位数的绝对差值。
  4. 优先修改差值最大的元素:把与中位数差值最大的元素修改为中位数,直到用完k次修改机会。

这个策略在示例中效果显著:排序后的中位数是4,两个7与中位数的差值为3(是最大的差值),修改这两个元素后数组元素完全一致,最大差值直接降为0。

更通用的滑动窗口解法

如果数组元素分布较为分散,基于中位数的策略可能无法得到全局最优解,此时可以采用滑动窗口法:

  1. 排序数组后,用滑动窗口覆盖n - k个连续元素(n为数组总长度)。
  2. 计算每个窗口内右端元素与左端元素的差值,其中最小的差值就是修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 02:57:30