
719 找出第 k 小的距离对(二分查找)
发布日期:2021-05-07 21:53:54
浏览次数:24
分类:精选文章
本文共 1360 字,大约阅读时间需要 4 分钟。
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-distance2. 思路分析:
① 其实这道题目比较隐晦,但是仔细分析起来也是存在一些特点的,首先我们从题目中可以得到最小距离与最大距离的,最小距离为0,最大距离为排序之后的首尾元素之差,而我们的想法是在这个范围之内找出第k小的距离,这个就有点像二分查找的模型了,已知了一个最大与最小的范围,我们需要在这个范围之内找到不断缩小范围从而得到正确的答案,对于这道题目来说我们需要通过二分检查当前得到的距离(mid = (l + r) // 2)中在nums的所有数对中是否存在大于等于k个数对使得距离是mid,假如成立我们可以缩小右边界,说明可能存在更小的距离使得数对的距离是等于mid的,假如不成立那么那么将左边界向右扩展一点,最后我们返回l即可
② 本质上还是需要知道这个是一个二分查找的模型,确定左右边界与更新左右边界的策略即可
3. 代码如下:
from typing import Listclass Solution: def check(self, x, a: List[int], k: int): res, index = 0, 1 for i in range(len(a)): j = index while j < len(a) and a[j] <= a[i] + x: j += 1 # 记录上一次索引 res += j - i - 1 index = j return res >= k def smallestDistancePair(self, nums: List[int], k: int) -> int: nums.sort() l, r = 0, nums[- 1] - nums[0] while l <= r: mid = (l + r) // 2 if self.check(mid, nums, k): r = mid - 1 else: l = mid + 1 return l
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月08日 20时18分46秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
《带你装B,带你飞》pytest成魔之路4 - fixture 之大解剖
2021-05-09
互联网App应用程序测试流程及测试总结
2021-05-09
根据轨迹分析出用户家在哪
2021-05-09
PostgreSQL查询表名称及表结构
2021-05-09
linux中使用awk命令
2021-05-09
LAB2 内核的内存管理
2021-05-09
如何使用google搜索?
2021-05-09
Redis分布式锁的正确实现方式
2021-05-09
设计模式-抽象工厂模式
2021-05-09
MySQL Explain查看执行计划详解
2021-05-09
IntelliJ IDEA 中,项目文件右键菜单没有svn选项解决办法
2021-05-09
Spring 动态绑定多实现类实例综述
2021-05-09
IDEA 调试Java代码的两个技巧
2021-05-09
MyBatis常见面试题:#{}和${}的区别是什么?
2021-05-09
Vue 数组和对象更新,但视图未更新,背后的故事
2021-05-09
剑指Offer面试题:9.二进制中1的个数
2021-05-09
《你是在做牛做马还是在做主管》- 读书笔记
2021-05-09
ASP.NET Core on K8S学习之旅(12)Ingress
2021-05-09