📅  最后修改于: 2023-12-03 15:28:24.683000             🧑  作者: Mango
给定一个长度为 N 的整数数组 A 和一个整数 K,你可以从数组 A 中删除最多 K 个元素,使得剩下的元素最大值和最小值的差最小。
这是一个典型的二分答案问题,可参考题目:Leetcode 410. Split Array Largest Sum。
首先,我们可以确定答案的范围,最小值为0,最大值为数组元素的最大值和最小值的差。
我们可以在 [最小值,最大值] 的范围内进行二分查找,每次取中间值 mid,并检查 A 中是否存在一个长度为 K 的子数组,使得子数组的最大值小于等于 mid。如果存在,则答案可能更小,将最大值缩小到 mid 左侧;否则,答案更大,将最小值扩大到 mid 右侧。最终我们可以得到最小的最大值。
时间复杂度:O(N * log(N)) 空间复杂度:O(1)
def check(A, mid, K):
cnt = 0
n = len(A)
l, r = 0, 0
while r < n:
while r < n and A[r] <= mid:
r += 1
cnt += r - l - 1
if cnt > K:
return False
l = r
r += 1
return cnt <= K
def minimize_difference(A, K):
l, r = min(A), max(A)
while l < r:
mid = (l + r) // 2
if check(A, mid, K):
r = mid
else:
l = mid + 1
return l
assert minimize_difference([1, 2, 4, 7], 2) == 2
assert minimize_difference([1, 10, 12, 14], 3) == 3
assert minimize_difference([3, 9, 12, 16, 20], 3) == 6