Leetcode 719. 找出第 K 小的数对距离
1.题目基本信息
1.1.题目描述
数对 (a,b) 由整数 a 和 b 组成,其数对距离定义为 a 和 b 的绝对差值。
给你一个整数数组 nums 和一个整数 k ,数对由 nums[i] 和 nums[j] 组成且满足 0 <= i < j < nums.length 。返回 所有数对距离中 第 k 小的数对距离。
1.2.题目地址
https://leetcode.cn/problems/find-k-th-smallest-pair-distance/description/
2.解题方法
2.1.解题思路
排序+二分查找+双指针。首先升序排列nums,则所有数对距离都在区间a=[0,nums[-1]-nums[0]]之间;所以题目等价于在区间a中找到最小的x,满足存在k个数对距离小于等于x
2.2.解题步骤
第一步,将nums进行升序排列
第二步,构建函数getCnt获取nums中数对距离小于等于参数x的数对的个数。使用双指针的方法进行计算
第三步,二分查找。红蓝染色。红色为不存在k个数对距离小于等于mid,蓝色为存在。left-1始终指向红色区域,right+1始终指向蓝色区域,最终的left即为题解
3.解题代码
python代码
class Solution:
def smallestDistancePair(self, nums: List[int], k: int) -> int:
# 思路:排序+二分查找+双指针。首先升序排列nums,则所有数对距离都在区间a=[0,nums[-1]-nums[0]]之间;所以题目等价于在区间a中找到最小的x,满足存在k个数对距离小于等于x
n = len(nums)
# 第一步,将nums进行升序排列
nums.sort()
# 第二步,构建函数getCnt获取nums中数对距离小于等于参数x的数对的个数。使用双指针的方法进行计算
def getCnt(x:int) -> int:
ans = 0
j = 0
for i in range(n):
while j < n and nums[j] - nums[i] <= x:
j += 1
ans += j - i - 1
return ans
# 第三步,二分查找。红蓝染色。红色为不存在k个数对距离小于等于mid,蓝色为存在。left-1始终指向红色区域,right+1始终指向蓝色区域,最终的left即为题解
left, right = 0, nums[n - 1] - nums[0]
while left <= right:
mid = (right - left) // 2 + left
cnt = getCnt(mid)
if cnt < k:
left = mid + 1
else:
right = mid - 1
return left
4.执行结果


浙公网安备 33010602011771号