【leetcode】719. Find K-th Smallest Pair Distance
2024-09-05 13:26:00
题目如下:
解题思路:对于这一类知道上限和下限,求第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
最新文章
- phpexcel引入MVC框架会导致__autoload引入类文件失败的解决办法
- SQLite - TRUNCATE TABLE
- DedeCMS织梦系统head.htm里无法调用栏目描述
- 异或的精彩应用 FIX_BTMAP_END
- 【Linux/Ubuntu学习 14】Linux下查看文件和文件夹大小
- LA 3641 (置换 循环的分解) Leonardo&#39;s Notebook
- 三星 note3销售地查询、销售地代码
- flowplayer+flashhls使用过程中发现的一些小问题
- HotSpot关联规则算法(2)-- 挖掘连续型和离散型数据
- [WebView五学习]:调试Web Apps
- C#复习资料
- java_反射
- Go 初体验 - 并发与锁.3 - 竞态
- Android精通之Handler讲解
- table中内容过长,table改变的问题
- git-04 同意分支合并
- Hive怎样加入第三方JAR
- 50. linux下查看tomcat日志
- 【Java】线程池的作用
- python使用SQLAlchemy对mysql操作
热门文章
- 和风api爬取天气预报数据
- laravel5.6操作数据curd写法(查询构建器)
- app中使用
- 2018 CCPC 吉林站 H Lovers || HDU 6562 (线段树哦)
- 关于C(n,m) 的奇偶 ,与C(n,0),C(n,1),C(n,2)…C(n,n).当中有多少个奇数
- CodeChef FNCS (分块+树状数组)
- Malformed UTF-8 characters, possibly incorrectly encoded 或中文乱码 (Uncaught InvalidArgumentException: Malformed UTF-8 characters, possibly incorrectly encoded in)
- DHCP原理
- Jexus 強勁、堅固、免費、易用的Linux ASP.NET服務器
- Hugo - 安装、设置及使用