博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【leetcode】719. Find K-th Smallest Pair Distance
阅读量:7090 次
发布时间: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

你可能感兴趣的文章
创建、使用SpringBoot项目
查看>>
LinkedBlockingQueue和ArrayBlockingQueue区别
查看>>
面试题38-数字在排序数组中出现的次数
查看>>
再次总结移动端事【件穿穿透】问题
查看>>
vue示例之transition-另外发现一个vue(可能的)小bug
查看>>
linux高级编程day07 笔记
查看>>
基于IPv6的数据包分析(第三组)
查看>>
JavaScript获取网页属性包括宽、高等
查看>>
Angular 4.0 架构详解
查看>>
JAVA递归遍历指定目录下的所有文件(包括子目录下的文件)
查看>>
range()和xrange()的区别
查看>>
快速搭建fabric-v1.1.0的chaincode开发环境
查看>>
Python学习的相关文件链接
查看>>
JSON 入门
查看>>
constructor中能不能有返回值?
查看>>
03动物类
查看>>
池化层pooling
查看>>
GPS坐标转百度地图并且加载地图示例.支持微信端访问
查看>>
浏览器自动跳转
查看>>
数据可视化-EChart2.0使用总结2
查看>>