719. 找出第 K 小的数对距离
这道题其实有那么一点二分猜答案的意思,也有很多类似题目,只不过这道题确实表达的不是很清晰不容易想到,题没问题,我的问题。
既然是猜答案,那么二分边界自然就是距离最大值和距离最小值了,每次我们得到一个mid,**遍历数组(双指针或二分)**找到所有小于等于mid的数对数量cnt。
遍历完之后如果cnt小于我们需要的k值,说明距离小了点,需要让左边界右移,这里其实也很好理解的。
就想清楚一个问题,距离越大,那么包含的数对就越多,距离越小当然就越少了,当前mid距离包含的数对cnt小于k,也就是说我们需要更多的cnt,那就增大距离呗,反之亦然。
双指针过程就是经典的一个指针一直右移另一个指针满足条件后直接瞬移,具体实现看代码。
总体来说,题目不难,想到思路比较难。
顺便复习一下快排。
class Solution {
public int smallestDistancePair(int[] nums, int k) {
mysort(nums);
int n = nums.length;
int left = 0;
int right = nums[n - 1] - nums[0];
int res = 0;
while (left <= right) {
int mid = left + ((right - left) >> 1);
int cnt = 0;
for (int i = 0, j = 0; j < n; j++) {
while (nums[j] - nums[i] > mid) i++;
cnt += j - i;
}
if (cnt >= k) {
res = mid;
right = mid - 1;
}else {
left = mid + 1;
}
}
return res;
}
public void mysort(int[] nums, int left, int right) {
if (left > right) {
return;
}
int key = nums[left];
int i = left;
int j = right;
while (i < j) {
while (i < j && nums[j] >= key) j--;
while (i < j && nums[i] <= key) i++;
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
nums[left] = nums[i];
nums[i] = key;
mysort(nums, left, i - 1);
mysort(nums, i + 1, right);
}
}
原文:https://leetcode.cn/problems/find-k-th-smallest-pair-distance/solution/by-nice-hermann9a2-jyk5/
719. 找出第 K 小的数对距离的更多相关文章
- Java实现 LeetCode 719 找出第 k 小的距离对(二分搜索法+二分猜数字)
719. 找出第 k 小的距离对 给定一个整数数组,返回所有数对之间的第 k 个最小距离.一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值. 示例 1: 输入: nums = [1,3, ...
- OpenJudge计算概论-找出第k大的数
/*================================================ 找出第k大的数 总时间限制: 1000ms 内存限制: 1000kB 描述 用户输入N和K,然后接 ...
- 【基础算法】排序-复杂排序之二(找出第K大的数)
切割的思想是高速排序最精髓的地方.每一次切割出来的元素K一个排在第K位,所以利用这样的思想我们至少知道3点 1. 被切割出来的元素K最后一定排在第K位. 2. 在K左边的元素一定比K小或者相等. 3. ...
- [Swift]LeetCode719. 找出第 k 小的距离对 | Find K-th Smallest Pair Distance
Given an integer array, return the k-th smallest distance among all the pairs. The distance of a pai ...
- 从数组中找出第K大的数
利用改进的快排方法 public class QuickFindMaxKValue { public static void main(String[] args) { int[] a = {8, 3 ...
- BUPT复试专题—寻找第 K 小的数(2009)
题目描述 给你 n 个完全不相同整数(n<=300),每一个数都大于 0 并且小于 1000,请找出 第 k 小的数. 输入 输入包括两行,第一行用空格隔开的两个数 n 和 k;第二行有 n 个 ...
- 算法---数组总结篇2——找丢失的数,找最大最小,前k大,第k小的数
一.如何找出数组中丢失的数 题目描述:给定一个由n-1个整数组成的未排序的数组序列,其原始都是1到n中的不同的整数,请写出一个寻找数组序列中缺失整数的线性时间算法 方法1:累加求和 时间复杂度是O(N ...
- [LeetCode] 719. Find K-th Smallest Pair Distance 找第K小的数对儿距离
Given an integer array, return the k-th smallest distance among all the pairs. The distance of a pai ...
- #7 找出数组中第k小的数
「HW面试题」 [题目] 给定一个整数数组,如何快速地求出该数组中第k小的数.假如数组为[4,0,1,0,2,3],那么第三小的元素是1 [题目分析] 这道题涉及整数列表排序问题,直接使用sort方法 ...
随机推荐
- vue学习day01
什么是 vue 构建用户界面 用 vue 往 html 页面中填充数据,非常的方便 框架 框架是一套现成的解决方案,程序员只能遵守框架的规范,去编写自己的业务功能! 要学习 vue,就是在学习 vue ...
- Python生成短uuid的方法
python的uuid都是32位的,比较长,处理起来效率比较低, 本算法利用62个可打印字符,通过随机生成32位UUID,由于UUID都为十六进制,所以将UUID分成8组,每4个为一组,然后通过模62 ...
- python基础练习题(题目 判断101-200之间有多少个素数,并输出所有素数。)
day7 --------------------------------------------------------------- 实例012:100到200的素数 题目 判断101-200之间 ...
- 最大数maxnumber - 题解【树状数组】
原题: 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. 插入操作.语法 ...
- XCTF练习题---MISC---坚持60S
XCTF练习题---MISC---坚持60S flag:flag{DajiDali_JinwanChiji} 解题步骤: 1.观察题目,下载附件,是一个java文件 2.打开玩了一会,真鸡儿难,试着反 ...
- mask-image实现聚光灯效果
大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...
- 一文带你读懂什么是vxlan网络
一个执着于技术的公众号 一.背景 随着云计算.虚拟化相关技术的发展,传统网络无法满足大规模.灵活性要求高的云数据中心的要求,于是便有了overlay网络的概念.overlay网络中被广泛应用的就是vx ...
- 【ASP.NET Core】URL重写
今天老周和大伙伴们聊聊有关 Url Rewrite 的事情,翻译过来就是 URL 重写. 这里不得不提一下,URL重定向与重写的不同. 1.URL重定向是客户端(通常是浏览器)向服务器请求地址A,然后 ...
- 『忘了再学』Shell基础 — 16、位置参数变量
目录 1.位置参数变量$n 2.位置参数变量$*和$@ 3.位置参数变量$# 位置參数变量的作用主要用于脚本的传参. 位置參数变量的名称和作用都是确定不能改变的,但是该变量的内容是可以更改的,也就是变 ...
- 【单片机】CH32V103C8T6定时器3程序实验
代码功能:每隔1毫秒进入一次定时器中断. 每隔1秒串口打印一次数据. time.c #include "time.h" #include "ch32v10x.h" ...