首页 > 其他分享 >719. 找出第 K 小的数对距离

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

时间:2025-01-10 20:46:41浏览次数:1  
标签:找出 right 719 nums 数对 mid 距离 left

找出第 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] > mid
            while (j < nums.length && nums[j] - nums[i] <= mid) {
                j++;
            }
            // 计算符合条件的数对个数,减去 i 和 i 的情况
            count += (j - i - 1);
        }
        return count;
    }
}

标签:找出,right,719,nums,数对,mid,距离,left
From: https://www.cnblogs.com/drunkerl/p/18664658

相关文章

  • 【Web】0基础学Web—鼠标事件、键盘事件、表单事件、元素距离、元素位置
    0基础学Web—鼠标事件、键盘事件、表单事件、元素距离、元素位置鼠标事件双击鼠标悬浮与鼠标离开鼠标按下与弹起(监听左右键和滚轮)键盘事件键盘按下键盘长按键盘弹起表单事件表单数据改变后,失去焦点时触发失去焦点触发获得焦点触发输入时触发示例表单事件示例元素距离......
  • 编辑距离(二维动态规划)
    给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数  。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1="horse",word2="ros"输出:3解释:horse->rorse(将'h'替换为'r')rorse-......
  • python 滑块验证码计算距离三种方法
    """滑块图像距离计算"""importrandomimportcv2importnumpyasnpimportrequestsimportddddocrdefdistance_cv(slice_url,bg_url):""":paramslice_url:滑块(缺口)图片地址:parambg_url:背景图地址:return:d......
  • 反距离空间插值
    参考这里进行 【数字孪生】Fluent模型仿真结果在Unity当中展示_unityfluent-CSDN博客 借助gpt学习法完成了一个空间插值 仿真找不到了,看之前的ppt里的,将就一下(假设这是我们的仿真)主要是通过ansys仿真,输出仿真的数据,但是这个数据量太大了(十万行)。处理之后保存为exce......
  • 切比雪夫距离(oiwiki学习)
    oiwiki——距离切比雪夫距离(Chebyshevdistance):对于两个\(n\)维向量\(\vec{x}=(x_1,x_2,...,x_n)\)与\(\vec{y}=(y_1,y_2,...,y_n)\),定义它们之间的切比雪夫距离为\(\max{|x_i-y_i|}\)。切比雪夫距离与曼哈顿距离的联系以二维情况讨论:\((i)\)将每一个点\((x,y)\)......
  • Python在多个Excel文件中找出缺失数据行数多的文件
      本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件内、某一列数据的特征,对其加以筛选,并将符合要求与不符合要求的文件分别复制到另外两个新的文件夹中的方法。  首先,我们来明确一下本文的具体需求。现有一个文件夹,其中有大量的Excel表格文件(在......
  • UNET改进61:添加LFE模块|高效长距离注意力网络
    本文内容:在不同位置添加LFE模块目录论文简介1.步骤一2.步骤二3.步骤三4.步骤四论文简介最近,基于Transformer的方法在各种视觉任务中取得了令人印象深刻的结果,包括通过利用自注意力(SA)进行特征提取的图像超分辨率(SR)。然而,在大多数现有的基于Transformer的模型中,SA......
  • itextpdf 找出PDF中 文字的坐标
    目录添加引用添加工具类调用找到位置,签名的话见:https://www.cnblogs.com/vipsoft/p/18644127新项目可以尝试一下iText7,我这边是老项目所以还是继续使用iText5,主打够用iText5没有直接提供获取文本精确位置的功能。它只能提取文本内容,而文本位置通常需要通过额外的解析......
  • ​​苹果远控超距离投屏控制手机,海外手机投屏管理运行自动化
    苹果云控超距离投屏控制手机实现高清投屏,实时获取手机画面,支持快捷打开关闭应用、点击滑动、文字输入以及文件传输等功能。苹果云控超距离投屏控制手机,可以有效解决海外苹果手机投屏难的问题。它通过将苹果手机与云控平台进行连接,实现了对手机的远程控制和管理。1.投屏功能......
  • 常见的距离算法和相似度计算方法
    作者|奋发的菜鸟酱@知乎来源|https://zhuanlan.zhihu.com/p/1381079991、常见的距离算法1.1欧几里得距离(EuclideanDistance)EuclideanDistance是一个通常采用的距离定义,它是在m维空间中两个点之间的真实距离。>>>pdist=nn.PairwiseDistance(p=2)>>>input1=torch.rand......