博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【leetcode】719. Find K-th Smallest Pair Distance
阅读量:7124 次
发布时间:2019-06-28

本文共 1244 字,大约阅读时间需要 4 分钟。

题目如下:

解题思路:对于这一类知道上限和下限,求第N位是什么的题目,可以先看看二分查找的方法可不可行。首先对nums进行排序,很显然任意两个元素距离绝对值最小是0,最大是nums[-1] - nums[0],所以第N小的距离肯定在 0 ~ (nums[-1] - nums[0]) 之间。采用二分查找的话,题目就变成了输入一个数值n,判断是不是第N小的距离。怎么判断n是否是第N小的距离呢?因为nums是有序的,对于nums[i]来说,只要找到(n + nums[i]) 在nums中所处的位置,设为j,那么nums[i] 与下标在[i+1,j]之间的元素的距离均小于n,与在[j+1,len(nums)-1]之间元素距离均大于n,求下标j同样可以采用二分查找。看起来很完美了,但是还有关键的一个地方,(n + nums[i])  在nums中不一定存在,或者即使存在但是会有多个值。因此需要找到(n + nums[i]) 在nums中所处的左右两个位置的下标,如果两个下标不一样,则表示不存在;下标的差值表示存在多少个(n + nums[i]) 。

代码如下:

class Solution(object):    def smallestDistancePair(self, nums, k):        import bisect        nums.sort()        low,high = 0, nums[-1] - nums[0]        while low <= high:            mid = (low + high) // 2            less ,equal = 0,0            for i,v in enumerate(nums):                left = (bisect.bisect_left(nums,v+mid) - 1 -i)                less += left                right = bisect.bisect_right(nums,v+mid) - 1 -i                equal += (right - left)            if less >= k:                high = mid - 1            elif less + equal < k:                low = mid + 1            elif less == k and equal == 0:                high = mid - 1            else:                break        return mid

 

转载于:https://www.cnblogs.com/seyjs/p/9603987.html

你可能感兴趣的文章
java多线程 -- 线程八锁
查看>>
AngularJS学习笔记1
查看>>
Linux-系统时钟
查看>>
LINUX 安装错误笔记ins_ctx.mk
查看>>
Linq实现点击率问题
查看>>
VMware vSphere 5.1 群集深入解析(二十三)- 数据存储架构与设计
查看>>
GitLab: API is not accessibl
查看>>
LVM分区在线扩容
查看>>
OpenSSL介绍
查看>>
Redis 集群部署
查看>>
XenMotion 与HA的区别
查看>>
|深入浅出|数据库范式
查看>>
SAP R3 Oracle 9i ORA-06413 连接未打开错误
查看>>
Liferay 启动过程分析13-初始化Resource Action
查看>>
因为根目录磁盘满了,我移动数据和软件造成mysql启动不了,查原因mysql.sock不在了...
查看>>
Windows 7之BitLock To Go
查看>>
XML的操作——JAXB进行Java对象和XML之间的转换
查看>>
Domino9下通过定时代理—使多台domino 服务器进行数据库复制(同步)
查看>>
VS2008 使用小技巧 提高编程效率
查看>>
安装Operations Manager代理程序
查看>>