题目如下:

解题思路:对于这一类知道上限和下限,求第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

最新文章

  1. phpexcel引入MVC框架会导致__autoload引入类文件失败的解决办法
  2. SQLite - TRUNCATE TABLE
  3. DedeCMS织梦系统head.htm里无法调用栏目描述
  4. 异或的精彩应用 FIX_BTMAP_END
  5. 【Linux/Ubuntu学习 14】Linux下查看文件和文件夹大小
  6. LA 3641 (置换 循环的分解) Leonardo&#39;s Notebook
  7. 三星 note3销售地查询、销售地代码
  8. flowplayer+flashhls使用过程中发现的一些小问题
  9. HotSpot关联规则算法(2)-- 挖掘连续型和离散型数据
  10. [WebView五学习]:调试Web Apps
  11. C#复习资料
  12. java_反射
  13. Go 初体验 - 并发与锁.3 - 竞态
  14. Android精通之Handler讲解
  15. table中内容过长,table改变的问题
  16. git-04 同意分支合并
  17. Hive怎样加入第三方JAR
  18. 50. linux下查看tomcat日志
  19. 【Java】线程池的作用
  20. python使用SQLAlchemy对mysql操作

热门文章

  1. 和风api爬取天气预报数据
  2. laravel5.6操作数据curd写法(查询构建器)
  3. app中使用
  4. 2018 CCPC 吉林站 H Lovers || HDU 6562 (线段树哦)
  5. 关于C(n,m) 的奇偶 ,与C(n,0),C(n,1),C(n,2)…C(n,n).当中有多少个奇数
  6. CodeChef FNCS (分块+树状数组)
  7. Malformed UTF-8 characters, possibly incorrectly encoded 或中文乱码 (Uncaught InvalidArgumentException: Malformed UTF-8 characters, possibly incorrectly encoded in)
  8. DHCP原理
  9. Jexus 強勁、堅固、免費、易用的Linux ASP.NET服務器
  10. Hugo - 安装、设置及使用