719 找出第 k 小的距离对(二分查找、双指针)

43 篇文章 0 订阅
41 篇文章 0 订阅

1. 问题描述: 

给定一个整数数组,返回所有数对之间的第 k 个最小距离。一对 (A,B) 的距离被定义为 A 和 B 之间的绝对差值。

示例 1:

输入:
nums = [1,3,1]
k = 1
输出:0 

解释:

所有数对如下:
(1,3) -> 2
(1,1) -> 0
(3,1) -> 2
因此第 1 个最小距离的数对是 (1,1),它们之间的距离为 0。

提示:

2 <= len(nums) <= 10000.
0 <= nums[i] < 1000000.
1 <= k <= len(nums) * (len(nums) - 1) / 2.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-k-th-smallest-pair-distance

2. 思路分析:

分析题目可以知道我们可以使用二分来枚举数对之间的距离,求解出nums中所有数对之间距离小于等于mid的个数,求解nums中数对之间小于等于mid的个数可以使用双指针算法来求解,对于每一个i我们找到最小的j,使得nums[i] - nums[j] <= mid,这样[i,j]之间的数与nums[i]的数对之间的距离都是小于等于mid(当指针i往后走不满足条件的时候指针j也一定往后走的所以我们可以使用双指针算法来求解),我们可以枚举出所有的i找到所有满足条件的数对,根据这个结果来更新二分的l和r即可。

3. 代码如下:

from typing import List


class Solution:
    # 计算数对之间绝对值小于等于mid的个数
    def get(self, nums: List[int], mid: int):
        res = 0
        i, j = 0, 0
        # 双指针算法
        while i < len(nums):
            # 找到第一个j使得nums[i] - nums[j] <= mid, 这样[l, r]中的数字与nums[i]的差值肯定是小于等于mid的
            while nums[i] - nums[j] > mid: j += 1
            res += i - j
            i += 1
        return res

    def smallestDistancePair(self, nums: List[int], k: int) -> int:
        # 先排序才可以使用双指针算法
        nums.sort()
        l, r = 0, 10 ** 6
        while l < r:
            mid = l + r >> 1
            if self.get(nums, mid) >= k:
                r = mid
            else:
                l = mid + 1
        return r
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值