数对 (a,b)
由整数 a
和 b
组成,其数对距离定义为 a
和 b
的绝对差值。
给你一个整数数组 nums
和一个整数 k
,数对由 nums[i]
和 nums[j]
组成且满足 0 <= i < j < nums.length
。返回 所有数对距离中 第 k
小的数对距离。
输入: nums = [1,3,1], k = 1 输出: 0 解释: 数对和对应的距离如下: (1,3) -> 2 (1,1) -> 0 (3,1) -> 2 距离第 1 小的数对是 (1,1) ,距离为 0 。
输入: nums = [1,1,1], k = 2 输出: 0
输入: nums = [1,6,1], k = 3 输出: 5
n == nums.length
2 <= n <= 104
0 <= nums[i] <= 106
1 <= k <= n * (n - 1) / 2
class Solution:
def smallestDistancePair(self, nums: List[int], k: int) -> int:
nums.sort()
lo = 0
hi = nums[-1] - nums[0]
while lo < hi:
mid = (lo + hi) // 2
count = 0
for i in range(len(nums)):
j = bisect.bisect(nums, nums[i] + mid, lo=i + 1)
count += j - i - 1
if count < k:
lo = mid + 1
else:
hi = mid
return hi