📅  最后修改于: 2023-12-03 15:21:58.473000             🧑  作者: Mango
有一个长度为 n 的数组,你可以删除其中任意一个元素,使得数组中的最大值和最小值之差最小,请设计一个算法,在删除一个元素的情况下,最小化最大和最小的差异。
我们可以排序数组,将数组分为两段,分别计算删除其中一个元素后的两段的最大值和最小值相减的差值。然后取这些差值的最小值即为所求。
注意到最大值和最小值可能在一段中,这时我们需要遍历这段中的所有数,取其中的最大值和最小值,再计算差值。
def minimize_diff(arr):
n = len(arr)
arr.sort()
diff = arr[-1] - arr[0]
# 划分数组为两段
for i in range(1, n-1):
diff1 = max(arr[i:i+2]) - min(arr[:i] + arr[i+2:])
diff2 = max(arr[i-1:i+1]) - min(arr[:i-1] + arr[i+1:])
diff = min(diff, diff1, diff2)
return diff
arr = [4, 6, 7, 2, 9, 5, 1, 8, 3]
minimize_diff(arr) # 2
由于需要排序数组,所以时间复杂度为 $O(n \log n)$,空间复杂度为 $O(1)$。