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方法 ...
随机推荐
- Android第1-2周作业
作业1:安装环境,截图编程界面,截图运行界面 作业2:九宫格 <?xml version="1.0" encoding="utf-8"?> < ...
- vue中父子组件钩子的执行顺序
我们已经非常熟悉单个的vue组件的生命周期执行顺序了,但是,如果有嵌套组件,父子组件的生命周期的执行顺序是什么? 当父子组件在加载的时候,执行的先后顺序为 父beforeCreate -> 父c ...
- 计算机系统6-> 计组与体系结构3 | MIPS指令集(中)| MIPS汇编指令与机器表示
上一篇计算机系统5-> 计组与体系结构2 | MIPS指令集(上)| 指令系统从顶层讲解了一个指令集 / 指令系统应当具备哪些特征和工作原理.这一篇就聚焦MIPS指令集(MIPS32),看看其汇 ...
- 0基础学习docker
进入docker容器命令 docker exec -it 容器id bash 获取镜像 # 1.获取镜像,镜像托管仓库 docker search centos # 查询centos镜像 docker ...
- 移动端屏幕适配(rem+js)
什么是移动端适配 在制作webapp时,一个很关键的问题就是适配各种机型不同屏幕的大小,让每种机型上的布局看起来都尽量一样. 也就是说用同一套代码在不同分辨率的手机上跑时,页面元素间的间距.留白,以及 ...
- Python常用数据结构-字典——2.1 字典方法 keys()
python字典常用方法: keys() # 获取所有的键 values() # 获取所有的值 items() # 获 ...
- 老生常谈系列之Aop--前言
老生常谈系列之Aop--前言 前言 既然是前言,那么这一篇就不会写具体的技术问题.这篇文章主要记录我一些个人的思考以及为什么要写文章的缘由.前不久在跟朋友的交流中偶然聊到了Aop,Aop全称为 Asp ...
- Java — 面向对象
目录 一.类和对象 二.方法 三.封装 四.继承 五.多态 六.final 七.static 八.抽象类 九.接口 十.内部类 一.类和对象 简介:类是对事物的一种描述,对象则为具体存在的事物. 类的 ...
- Ansible的参数介绍
安装完成ansible后查看ansible的参数:ansible -h ansible 命令格式:Usage: ansible <host-pattern> [options] ansib ...
- ubuntu 20.04 source mirror(aliyun)
x64 deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb-src http://m ...