719. Find K-th Smallest Pair Distance

文章目录

  • 1 题目理解
  • 2 分析思路
    • 2.1 桶排序
    • 2.2 二分+动态规划
    • 2.3 用堆实现
  • 3相似题目786
  • 3.1 二分
    • 3.2 堆

1 题目理解

输入:一个int数组nums,一个数字k
输出:返回所有数字对中,数字对距离第k小的距离。
规则:一个数组中两两配对计算差值得到距离。距离值从小到大排序,第k位置的元素就是返回值。
例如
Input:
nums = [1,3,1]
k = 1
Output: 0
所有的配对距离是:
(1,3) -> 2
(1,1) -> 0
(3,1) -> 2
所有距离中从小到大排序,第1个是0,所以返回0。

Note:

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

2 分析思路

内容来源于花花酱。

2.1 桶排序

最直接的想法是用两个for循环计算每个匹配对的距离,然后对距离进行排序。返回第k个元素 。排序算法选择桶排序,加快速度。int[] distance记录距离出现的次数。distance[0]表示有几个配对的距离为0。

class Solution {public int smallestDistancePair(int[] nums, int k) {Arrays.sort(nums);int n = nums.length;int  max = nums[n-1];int[] distance = new int[max+1];for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){distance[nums[j] - nums[i]]++;}}for(int i = 0;i<max;i++){k -= distance[i];if(k<=0){return i;}}return 0;}
}

时间复杂度O(n2max)O(n^2max)O(n2max)

2.2 二分+动态规划

我们先对数组nums排序。
返回值最小值是0,最大值=nums最大值-nums最小值。
用二分法查找返回值,也就是距离。
例如m=3,我们需要查找有多少个配对的距离小于等于3。
查找的方法使用动态规划。
设dp[0] 为所有和nums[0]配对的距离小于等于3,有多少个。
dp[1]为所有和nums[0],nums[1]的配对距离小于等于3,有多少个。

dp[n-1]表示所有配对中距离小于等于3,有多少个。
例如nums={1,1,3,5,8}。
最开始,i=0,j=0,
nums[0] - nums[0] =0<=m,成立,j++;
nums[1]-nums[0]=1-1=0<=m,成立,j++;
nums[2]-nums[0]=3-1=2<=m,成立,j++;
nums[3]-nums[0]=5-1=4<=m,不成立,退出循环,因为数组是有序的,再比较下去,距离只会越来越大。
那么dp[0] = j-i-1=3-0-1=2,表示所有和nums[0]配对中,有2个配对的距离<=m。

接着计算i=1,此时j不需要从0开始。

配对(0,2)在上一步已经计算了,配对(1,2)的距离一定<=m。
因为nums[2]-nums[0]<=m,在上一步已经计算过了,而nums[1]>nums[0],同样的数减去一个更大的数,差只能更小。
所以j不需要从0开始。

j=3,nums[3]-nums[1]=5-1=4<=m,不成立,退出循环。
dp[1] = dp[0] + (j-i-1)=3,表示所有和nums[0]、nums[1]配对中,有3个配对的距离<=m。

接着计算i=4,j=3。

class Solution {public int smallestDistancePair(int[] nums, int k) {Arrays.sort(nums);int n = nums.length;int l = 0;int r = nums[n-1]-nums[0];while(l<=r){int m =  l+((r-l)>>1);if(countNumber(nums,m)>=k){r = m - 1;}else{l = m + 1;}}return l;}private int countNumber(int[] nums,int m){int j = 0;int n = nums.length;int[] dp = new int[n];for(int i=0;i<n;i++){while(j<n && nums[j]-nums[i]<=m) j++;dp[i] = ( i==0? (j-i-1) : dp[i-1]+(j-i-1));}return dp[n-1];}
}

时间复杂度O(nlogn)O(nlogn)O(nlogn),n应该是数组长度和数组最大值之间的最大值。当然最后的代码还可以做空间优化。

2.3 用堆实现

参考力扣
首先将数组排序,排序之后,相邻元素的差最小。先将nums[i]和nums[i+1],放入堆中,之后再依次将nums[i]和nums[i+2] nums[i]和nums[i+3]放入堆中 …
时间复杂度O((k+N)lgN),时间复杂度过高。

class Solution {public int smallestDistancePair(int[] nums, int k) {Arrays.sort(nums);PriorityQueue<Node> heap = new PriorityQueue<Node>(nums.length,Comparator.<Node> comparingInt(node -> nums[node.nei] - nums[node.root]));int n = nums.length;for(int i=0;i<n-1;i++){heap.offer(new Node(i,i+1));}Node node = null;for(;k>0;k--){node = heap.poll();            if(node.nei+1<n){heap.offer(new Node(node.root,node.nei+1));}}return nums[node.nei]- nums[node.root];}class Node {int root;int nei;Node(int r, int n) {root = r;nei = n;}}}

3相似题目786

3.1 二分

虽说相似,没有找到规律还是理解不了的。即使找到规律了也不一定会数数,在O(n)时间复杂度内。

class Solution {public int[] kthSmallestPrimeFraction(int[] A, int K) {double l = 0;double r = 1.0;int[] answer = new int[2];while(l<r){double m = (l+r)/2;int[] res = countSmallerOrEqual(A,m);if(res[0] == K){answer[0] = res[1];answer[1] = res[2];break;}else if(res[0]>=K){r = m;}else{l = m;}}return answer;}private int[] countSmallerOrEqual(int[] A,double m){int count = 0;int p = 0,q = 1;int i=0;for(int j=1;j<A.length;j++){while(A[i]<=m*A[j]) i++;count += i;if(i>0){i=i-1;if(p*A[j]<q*A[i]){p = A[i];q = A[j];}}}return new int[]{count, p, q};}}

对于countSmallerOrEqual函数不知道怎么写,可以先用两个for循环来写。会发现i的循环可以提取出来。因为A数组是递增的。例如[1,2,3,5]。如果1/2满足条件,那么1/3一定满足条件。因为分子不变,分母增加,数值会越来越小。

private int[] countSmallerOrEquals(int[] A ,double m){int count = 0;int p = 0,q = 1;for(int j=1;j<A.length;j++){int i=0;for(;i<j;i++){if(A[i]>m*A[j]){break;}}count += i;i=i-1;if(p*A[j]<q*A[i]){p = A[i];q = A[j];}}return new int[]{count, p, q};}

3.2 堆

class Solution {public int[] kthSmallestPrimeFraction(int[] A, int k) {int[] answer = new int[2];PriorityQueue<int[]> pq = new PriorityQueue<int[]>((a, b) ->A[a[0]] * A[b[1]] - A[a[1]] * A[b[0]]);for(int i=1;i<A.length;i++){pq.offer(new int[]{0,i});}while(k>1){int[] vals = pq.poll();if(vals[0]+1 < vals[1]){pq.offer(new int[]{vals[0]+1,vals[1]});}k--;}answer = pq.poll();return new int[]{A[answer[0]],A[answer[1]]};}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySql为查询结果添加前、后缀

SQL CONCAT函数&#xff1a;用于将两个字符串连接起来&#xff0c;形成一个单一的字符串。 举例&#xff1a; 查询当前系统时间 正常查询&#xff1a;select current_date ; 添加前缀&#xff1a;select CONCAT(“系统时间&#xff1a;”,current_date); 添加后缀&#xff1a;s…

关于HbSrv.exe

终于找到他了&#xff0c;竟然是HorBar的进程。我用的进程查看器PrvView3.5.3.8汉化版&#xff0c;看到的。HbSrv.exe位置在 C:\Program Files\Hotbar\bin\4.4.9.0\HbSrv.exe。他倒好像不是病毒&#xff0c;是以前我装的插件hotbar&#xff0c;卸载竟然没有卸载掉。还以为是什么…

第七十八期:2019全球程序员薪酬报告:软件开发比机器学习抢手!40岁后收入下滑

Hired发布了《2019 年度薪酬状况报告》。调查显示&#xff1a;仅有23%的计算机科学相关专业硕士/博士表示高学历为其带来高薪&#xff1b;54%从业者表示不会继续深造&#xff1b;40岁后薪资呈现下降、60岁基本降到30岁水平。 作者&#xff1a;佚名 Hired发布了《2019 年度薪酬…

动态规划再理解(53、121、174)

本次文档也是对动态规划的 再认识 。 之前写过一些文章&#xff0c;在处理动态规划问题的时候依据的思路是 &#xff1a;暴力搜索->加缓存->动态规划。相关文章有&#xff1a;算法八——动态规划&#xff0c;动态规划——0-1背包问题&#xff0c;动态规划——矩阵中的最短…

获得Web目录URL

获得Web目录URL string strRoot String.Format("http://{0}{1}",Request.Url.Host,Request.ApplicationPath);posted on 2004-07-02 18:05 浙林龙哥 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/huqingyu/archive/2004/07/02/20622.html

第七十九期:阿里程序员感慨:码农们过去暴富有多轻松,现在赚钱就有多辛苦

互联网的世界也是一座围城。有人挤破脑袋想要进去。而有人又觉得是被互联网的光鲜表象欺骗了忙着要出来&#xff0c;但最终&#xff0c;这些人都会离开。 作者&#xff1a;职场八卦 互联网的世界也是一座围城。有人挤破脑袋想要进去。而有人又觉得是被互联网的光鲜表象欺骗了…

树上倍增求LCA详解

LCA&#xff08;least common ancestors&#xff09;最近公共祖先 指的就是对于一棵有根树&#xff0c;若结点z既是x的祖先&#xff0c;也是y的祖先&#xff08;不要告诉我你不知道什么是祖先&#xff09;&#xff0c;那么z就是结点x和y的最近公共祖先。 定义到此。 那么怎么求…

[导入]画带阴影效果的文字

画带阴影效果的文字文章来源:http://blog.csdn.net/net_lover/archive/2004/07/06/35553.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2004/07/07/816094.html

174. Dungeon Game

文章目录1题目理解2 分析1题目理解 故事背景&#xff1a;恶魔把公主抓走了&#xff0c;关在地牢里面。骑士想要把公主救出来。初始化的时候&#xff0c;骑士有一个健康值init。 输入&#xff1a;int[][] dungeon表示地牢中魔鬼布局图。dungeon[i][j]>0&#xff0c;恶魔会提…

第八十期:初创公司5大Java服务困局,阿里工程师如何打破?

初创公司遇到的每一个问题都可能攸关生死。创业之初更应该总结行业的常见问题&#xff0c;对比方案寻找最优解。 作者&#xff1a;常意 初创公司遇到的每一个问题都可能攸关生死。创业之初更应该总结行业的常见问题&#xff0c;对比方案寻找最优解。阿里巴巴地图技术专家常意在…

关于某些人和某些事的断想

关于某些人和某些事的断想<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />人的一生总会碰到这样那样的一些人和一些事&#xff0c;偶然或必然。这些人、这些事或许在我们的心里荡起过些许的波澜&#xff1b;又或许只是一闪而过&…

第八十一期:Java性能优化:35个小细节,提升你的Java代码运行效率

如果项目着眼于尽快无BUG上线&#xff0c;那么此时可以抓大放小&#xff0c;代码的细节可以不精打细磨&#xff1b;但是如果有足够的时间开发、维护代码&#xff0c;这时候就必须考虑每个可以优化的细节了&#xff0c;一个一个细小的优化点累积起来&#xff0c;对于代码的运行效…

Python数据类型与运算符号

一&#xff1a;数据类型 【1】为什么要有数据类型 &#xff08;1&#xff09;不同的数据含有不同的特征 例如&#xff1a;有文本数据 音频数据 视频数据 &#xff08;2&#xff09;不同的特征需要有不同的类型用来描述 二&#xff1a;数据类型的分类 【1】 &#xff08;1&#…

85. Maximal Rectangle

用dp计算矩形面积 文章目录1题目理解2分析2.1 暴力搜索2.2 动态规划3 相关题目1题目理解 输入&#xff1a;char[][] matrix 是一个二维数组&#xff0c;值由0和1组成。 输出&#xff1a;一个矩形的面积&#xff0c;这个矩形只包含1。 例子&#xff1a; Input: [ [“1”,“0”,…

全面搞定jive3.1.1

全面搞定jive3.1.1yippit 原创 (参与分&#xff1a;351&#xff0c;专家分&#xff1a;1740) 发表&#xff1a;2003-9-13 下午8:33 版本&#xff1a;1.0 阅读&#xff1a;8316次 近日坛子里面很多人问起这个问题&#xff0c;要么中文显示乱码出错&#xff0c;要么不能数…

spring mvc学习(6):springMVC的常见注解

1RequestMapping的位置可以在类名或者方法名之前 或者同时加在两个位置 最终的路径是两个位置路径的组合 value是默认的名称&#xff0c;可以省略&#xff0c;如果有其他参数&#xff0c;就不能省略 如下配置的访问路径&#xff1a;协议://主机&#xff1a;//端口/虚拟路径…

powershell some check

// TODO 待处理 1 # powershell 编写的某些校验2 3 function listChecks() {4 write-host 可用的校验;5 write-host CRC - 循环冗余校验;6 return -- done;7 }8 9 # 字节数组 CRC, 不知道是不是符合CRC定义 10 function crcCheck($byteArray) { 11 if ($byteAr…

801. Minimum Swaps To Make Sequences Increasing

文章目录1题目理解2 暴力搜索3 动态规划3.1第一种情况3.2第二种情况1题目理解 输入&#xff1a;两个int数组A和B&#xff0c;长度都不为0&#xff0c;并且长度相同。 输出&#xff1a;最小交换次数。 规则&#xff1a;最终想要得到两个严格递增的数组。如果原始数组不符合要求…

用属性还是字段?

用属性还是字段&#xff1f; 我觉得对于实体类(没有方法的类)&#xff0c;只要用字段就好了&#xff0c;没必弄得像下面这个样子&#xff1a; private AttributeConfig m_ColumnMap;public AttributeConfig ColumnMap{get{return m_ColumnMap;}set{m_ColumnMapvalue;}}posted …

spring mvc学习(7):springmvc学习笔记(常用注解)

1. Controller Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用Controller注解定义的控制器有如下特点: 不需要继承任何类, 也不需要实现任何接口可以处理多个请求可以使用Servlet的相关特性 spring自动扫描所有基于注解的类, 并将其注册为spring…