给定一个整数数组,返回所有数对之间的第 k 个最小距离。一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值。
二分查找和双指针。
from typing import *
class Solution:
def smallestDistancePair(self, nums: List[int], k: int) -> int:
nums.sort()
max_val = nums[-1] - nums[0]
min_val = max_val
for i in range(1, len(nums)):
min_val = min(min_val, nums[i] - nums[i - 1])
lo, hi = min_val, max_val
while lo <= hi:
mid = (hi + lo) // 2
cnt = self.helper(nums, mid, k)
if cnt == k:
res = mid
hi = mid - 1
elif cnt < k:
lo = mid + 1
else:
hi = mid - 1
return hi
def helper(self, nums, val, k):
cnt = 0
j = 0
for i in range(1, len(nums)):
while j < i and nums[j] + val <= nums[i]:
j += 1
cnt += (i - j)
return cnt