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.执行结果

posted @ 2025-06-25 09:24  Geek0070  阅读(12)  评论(0)    收藏  举报