719. 找出第 K 小的数对距离

news/2025/1/10 20:27:21/文章来源:https://www.cnblogs.com/drunkerl/p/18664658

找出第 K 小的数对距离
数对 (a,b) 由整数 ab 组成,其数对距离定义为 ab 的绝对差值。

给你一个整数数组 nums 和一个整数 k ,数对由 nums[i]nums[j] 组成且满足 0 <= i < j < nums.length 。返回 所有数对距离中k 小的数对距离。

示例 1:

输入:nums = [1,3,1], k = 1
输出:0
解释:数对和对应的距离如下:
(1,3) -> 2
(1,1) -> 0
(3,1) -> 2
距离第 1 小的数对是 (1,1) ,距离为 0 。

示例 2:

输入:nums = [1,1,1], k = 2
输出:0

示例 3:

输入:nums = [1,6,1], k = 3
输出:5

思路

  1. 排序

    • 首先对数组 nums 进行排序。因为在排序后的数组中,数对的距离有一个规律:|nums[i] - nums[j]|(其中 i < j)会随着 ij 的增大而增大。因此,排序后的数组有助于我们更高效地查找第 k 小的距离对。
  2. 二分查找

    • 问题是求第 k 小的距离,而距离的范围是从0nums[nums.length - 1] - nums[0](即排序后的数组中最大值和最小值的差)。

    • 我们可以使用二分查找来逼近第 k 小的距离。具体的二分查找目标是:

      • 左边界 left:表示最小的距离,即 0
      • 右边界 right:表示最大的距离,即 nums[nums.length - 1] - nums[0]
      • 通过判断中间的距离 mid,我们可以决定更新二分查找的左右边界,从而逐步找到第 k 小的距离。

      这里把 mid 这个中间距离挑出来的意思是因为,我想要通过统计小于等于 mid 这个中间距离的数对的个数来决定,我这个二分的区间应该怎样去收缩。并且也说明我要写一个用于统计数量的函数,也就是下面的 countPairs

  3. 计数函数

    • 对于每一个 mid,我们需要计算所有数对 (nums[i], nums[j]),使得 |nums[i] - nums[j]| <= mid 的数对的数量。我们使用双指针技巧来高效计算这个数量。
  • 使用指针 i 固定一个元素,指针j 作为第二个元素,ji+1 开始向右移动,直到 nums[j] - nums[i] > mid
  • 在此过程中,i 固定时,所有符合 nums[j] - nums[i] <= mid 条件的数对 (i, j) 都是有效的。
  • countPairs(mid) 函数的时间复杂度是 O(n),因为我们只需要一次遍历数组即可。
  1. 如何更新二分查找的左右边界
    • 如果对于当前的 midcountPairs(mid) 的值小于 k,说明当前的 mid 太小,我们需要增加 mid,因此更新左边界 left = mid + 1
    • 如果 countPairs(mid) 的值大于或等于 k,说明当前的 mid 可能是解或者可以继续缩小,所以更新右边界 right = mid
import java.util.Arrays;class Solution {public int smallestDistancePair(int[] nums, int k) {Arrays.sort(nums); // 排序数组int left = 0, right = nums[nums.length - 1] - nums[0]; // 左右边界初始化while (left < right) {int mid = left + (right - left) / 2; // 计算 mid,避免溢出if (countPairs(nums, mid) < k) {left = mid + 1; // 如果符合条件的数对小于 k,更新左边界} else {right = mid; // 否则更新右边界}}return left; // 最终的 left 即为第 k 小的距离}// 计算所有 |nums[i] - nums[j]| <= mid 的数对个数private int countPairs(int[] nums, int mid) {int count = 0;int j = 0;// 使用双指针技巧for (int i = 0; i < nums.length; i++) {// 向右移动 j,直到 nums[j] - nums[i] > midwhile (j < nums.length && nums[j] - nums[i] <= mid) {j++;}// 计算符合条件的数对个数,减去 i 和 i 的情况count += (j - i - 1);}return count;}
}

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

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

相关文章

iterm2

外观 这个github上的项目提供了很多主题 https://iterm2colorschemes.com/ 亮色主题感觉还可以的几个: OneHalfLight、BuiltinLight、BlulocoLight、Materil、ProLight、Tango Half Adapted 下面截图是基于 Tango Half Adapted用蓝色代替青色,黄色加深之后的效果(vim括号插件…

22. MDI窗口设计

一、什么是MDI窗口MDI 窗口(Multiple-Document Interface),又称多文档界面,它主要用于同时显示多个文档,每个文档显示在各自的窗口中。MDI 窗口中通常包含子菜单和窗口菜单,用于在窗口或文档之间进行切换。用 QMainWindow 建立的主界面,通常会同时建立或打开多个相互独立…

详解:订单履约系统规划

大家好,我是汤师爷~ 什么是订单履约系统? 订单履约是从消费者下单支付到收到商品的全流程管理过程,包括订单接收、订单派单、库存分配、仓储管理和物流配送等环节,核心目标是确保商品准时、准确地送达消费者手中。 通过订单履约系统,消费者可以实时了解商品的物流状态和预…

文件单独编译生成

编译设备树也最好在 source过的那个窗口中来编译错误提示如下: 同时在makefile文件修改时也要注意

In‐band Network Telemetry

#卫星 #遥测技术 #INT 一、INT是什么? INT,In‐band Network Telemetry ,带内网络遥监测。telemetry,英文原意是遥测技术。从其英文名称可以了解如下: a.In-band,说明监测指令及数据均在带内传输 b.telemetry ,说明是长距离,远程获取网络数据的方法。 想象一下卫星在…

潮汐指纹识别工具 : 在线网站识别利器

最近发现了一个免费在线收集网站信息的工具,感觉挺好用的,给各位推荐下。潮汐在线指纹识别是山东新潮信息技术有限公司安全团队提供的一个免费开源在线网站信息收集工具。 功能亮点: 全面扫描 只需输入目标网站的URL或IP地址,即可获取该网站的标题、中间件、操作系统、域名…

JAVA-Day 11:数组的静态初始化和遍历

数组的静态初始化和遍历 数组静态初始化格式 数组的静态初始化与遍历 完整格式:数据类型 [] 数组名=new 数据类型[]{元素1,元素2,元素3,....} 简化格式:数据类型 [] 数组名={元素1,元素2,元素3,....} []在数组名前后都可以 代码如下: int number[]={1,2,3,4,5};for (int …

JAVA-Day 10:Do...While循环语句

Do...While循环语句 Do...While循环格式 初始化语句; do{ 循环体语句; 条件控制语句; }while(条件判断语句); 例: 使用do...while循环输出1-10的和(包括10) int i=1;int count=0;do{count+=i;i++;}while(i<=10);System.out.println(count);代码运行结果如下图所示:

配置tigerVNC,登陆远程服务器

1.在远程服务器安装、配置 (1) sudo apt update sudo apt install xfce4 xfce4-goodies (2) 安装TigerVNC sudo apt install tigervnc-standalone-server (3) 配置vnc vncpasswd (4) 配置.vnc: vim ~/.vnc/xstartup 添加:cat .vnc/xstartup#!/bin/sh # 启动 D-Bus 会话 (如果未…

CF1993F2 Dyn-scripted Robot (Hard Version)

Dyn-scripted Robot (Hard Version) 题目链接。 Problem Easy Version:\(K \le n\)。 Hard Version:\(K \le 10^{12}\)。 一个 \(Oxy\) 平面上有一个 \(w \times h\) 矩形,矩形的左下方有点 \((0, 0)\) ,右上方有点 \((w, h)\) 。 您还有一个最初位于点 \((0, 0)\) 的机器人…

OmniNxt 论文阅读

来源: https://arxiv.org/html/2403.20085?_immersive_translate_auto_translate=1 标题: OmniNxt: A Fully Open-source and Compact Aerial Robot with Omnidirectional Visual Perception OmniNxt 感觉是, 取自 Omnidirectional 中 全的意思, Nxt 像是 Next 的意思,表…

2024-12-1-#{}与¥{}的区别-response

{}与¥{}的区别response实现重定向response响应字符数据response响应字节数据以及导入工具类实现响应