• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > Find K-th Smallest Pair Distance:查找数组元素中差值第K大的两个元素的差值

Find K-th Smallest Pair Distance:查找数组元素中差值第K大的两个元素的差值

作者:小雄鹿 字体:[增加 减小] 来源:互联网 时间:2017-10-30

小雄鹿通过本文主要向大家介绍了Leecode,二分查找 滑动窗口等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

 

Given an integer array, return the k-th smallest distance among all the pairs. The distance of a pair (A, B) is defined as the absolute difference between A and B.

Example 1:

Input:
nums = [1,3,1]
k = 1
Output: 0 
Explanation:
Here are all the pairs:
(1,3) -> 2
(1,1) -> 0
(3,1) -> 2
Then the 1st smallest distance pair is (1,1), and its distance is 0.

 

Note:

  1. 2 <= len(nums) <= 10000.
  2. 0 <= nums[i] < 1000000.
  3. 1 <= k <= len(nums) * (len(nums) - 1) / 2.

 

 

 

思路:二分查找+滑动窗口思想,很巧妙的一道题。最后二分查找注释的位置困扰了我好久。

 

class Solution {
   public int smallestDistancePair(int[] nums, int k) {
       Arrays.sort(nums);
       
       int l =0;
       int h =nums[nums.length-1]-nums[0];
       while(l<h){//二分查找,因为当count==k时,搜索到的m差值可能并不存在,需要继续循环判断,直到范围确定           
           int m = (l + h)/2;          
           //search
           //使用窗口思想,判断差值<=k的个数,r-l即表示[l,r]间间隔<m的个数(每确定一个窗口就新增加了(r-l+1)- 1个差值对)
           int left = 0;
           int count = 0;
           for(int right = 0;right<nums.length;right++){
               while(nums[right] - nums[left]>m){
                   left++;
               }
               count+= right-left;
           }
           /*注意,下面这种写法是错误的,因为比如l=3,r=4,m=(3+4)/2 = 3(因为是向下取整),所以此次迭代有可能l=m后,l=3,r=4陷入死循环!
           if(count<=k){
               l = m ;
           }else{
               h = m-1;
           }
           */
           
           if(count>=k){
               h = m ;
           }else{
               l = m+1;
           }          
       }
        return l;
    }
}


复杂度:

 

 

Complexity Analysis

  • Time Complexity: O(N \log{W} + N \log{N})O(NlogW+NlogN), where NN is the length of nums, and WW is equal to nums[nums.length - 1] - nums[0]. The \log WlogW factor comes from our binary search, and we do O(N)O(N) work inside our call to possible (or to calculate count in Java). The final O(N\log N)O(NlogN) factor comes from sorting.

  • Space Complexity: O(1)O(1). No additional space is used except for integer variables.

 

 

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Find K-th Smallest Pair Distance:查找数组元素中差值第K大的两个元素的差值

相关文章

  • 2017-05-28VC6.0如何创建以及调用动态链接库实例详解
  • 2017-05-28VC WinExec打开指定程序或者文件的方法
  • 2022-04-30C语言数组指针(指向数组的指针)详解
  • 2017-05-28深入Linux grep指令的详解(实用型)
  • 2017-05-28c++中堆栈及创建对象示例代码
  • 2017-05-28C++中virtual继承的深入理解
  • 2017-05-28纯C语言:检索与周游广度深度遍历源码分享
  • 2017-05-28C语言中函数返回字符串的方法汇总
  • 2017-05-28浅谈stringstream 的.str()正确用法和清空操作
  • 2017-05-28C和MFC巧妙获取外网IP的两种实现方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++中的三大函数和操作符重载(Boolan)
    • C++实现顺序排序算法简单示例代码
    • Inline Hook(ring3)的简单C++实现方法
    • 函数指针的一些概念详解
    • c语言调用汇编的方法
    • C语言kmp算法简单示例和实现原理探究
    • C语言 strftime 格式化显示日期时间的实现
    • C语言实现输入一颗二元查找树并将该树转换为它的镜像
    • C++十六进制宏的用法详解
    • C++求逆序对的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有