📅  最后修改于: 2023-12-03 15:42:01.805000             🧑  作者: Mango
假设你有一个整数数组 nums
,你可以对其中的任意一个元素执行以下操作:
请你通过将数组 nums
中的元素增加或减少 1 来使最终数组中的最大值和最小值之差最小化。
为了方便,可以在操作数组时允许任意多的增加或减少操作。
首先我们可以对数组进行排序,这样最小的数和最大的数就分别在数组两端。我们可以将数组中的数尽量向中间靠拢,因此我们可以将较小的数加 1,将较大的数减 1。
如果最大值和最小值的差值 diff
大于 $2n$,则对所有数都加上 $diff/2$。因为对于每个数 $x$,其加上 $diff/2$ 后,最大值和最小值的差值仅会减少 $diff/2$,但是由于 $diff>2n$,因此最大值和最小值的差值仍然大于等于 1。
最后,如果 diff
是奇数,则需要将中间的数加上或减去 1,目的是使最终差值为 1。
def min_max_diff(nums: List[int]) -> int:
nums.sort() # 排序
diff = nums[-1] - nums[0] # 最大值和最小值的差值
if diff > 2 * len(nums): # 对所有数加上 diff/2
for i in range(len(nums)):
nums[i] += diff // 2
else:
mid = (nums[-1] + nums[0]) // 2 # 中间值
for i in range(len(nums)):
if nums[i] <= mid:
nums[i] += 1
else:
nums[i] -= 1
if diff % 2 == 1: # 如果 diff 是奇数,则需要将中间的数加上或减去 1
for i in range(len(nums)):
if nums[i] == mid:
nums[i] += 1
break
return nums[-1] - nums[0]
注意:上述代码中的 List[int]
表示 Python 中的类型注释,用来说明函数的参数和返回值的类型。