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

找出第k小的数对距离

时间:2023-05-29 15:33:31浏览次数:26  
标签:begin 找出 pq nums int mid 距离 right

数对 (a,b) 由整数 a 和 b 组成,其数对距离定义为 a 和 b 的绝对差值。
给你一个整数数组 nums 和一个整数 k ,数对由 nums[i] 和 nums[j] 组成且满足 0 <= i < j < nums.length ,返回 所有数对距离中第 k 小的数对距离。

1. 小根堆二维搜索(超时)

class Solution {
public:
    int smallestDistancePair(vector<int>& nums, int k) {
        int n = nums.size();
        sort(nums.begin(),nums.end());
        priority_queue<tuple<int, int, int>> pq;
        pq.emplace(0, 0, 0); // 取相反数变成小顶堆
        while (!pq.empty() ){
            auto [_, i, j] = pq.top(); pq.pop();//两个数组对应下标
            if(i!=j) k--;
            if(k==0) return nums[j]-nums[i];
            if(i==j&&i+1<n)
                pq.emplace(0, i+1, j+1);
            if (j + 1 < n )//无条件移动
                pq.emplace(-(nums[j+1]-nums[i]), i, j+1);
        }
        return 0;
        }
};

2. 二分法

class Solution {
public:
    int smallestDistancePair(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end());//排序
        int n = nums.size();
        int left = 0, right = nums.back() - nums.front();//最小数对距离和最大数对距离
        while (left < right) {
            int mid = (left + right) / 2;
            int cnt = 0;
            //统计以j为右边界,距离小于等于mid 的数对个数
            for (int j = 0; j < n; j++) {
                int leftval = nums[j] - mid;//这个是区间最左侧的值
                auto leftbound = lower_bound(nums.begin(), nums.begin() + j, leftval);//获得左边界
                int i = leftbound - nums.begin();
                cnt += j - i; //右边界-左边界,获得左边界可以取得的个数,即满足条件的数对数
            }
            //
            if (cnt < k) left = mid + 1;//不满足
            else right = mid;
      
        }
        return right;
    }
};

标签:begin,找出,pq,nums,int,mid,距离,right
From: https://www.cnblogs.com/929code/p/17440611.html

相关文章

  • HTML中让上下两个div之间保持一定距离或没有距离
    这篇文章主要为大家详细介绍了HTML让上下两个DIV之间保持一定距离或没有距离,可以用来参考一下。1、若想上下DIV块之间距离,只需设定:在CSS里设置DIV标签各属性参数为0div{margin:0;border:0;padding:0;}这里就设置了DIV标签CSS属性相当于初始化了DIV标签CSS属性,这里设置margin外......
  • #295. 「BJWC2010」矩阵距离 题解 2021-09-23 21:42:32
    #295.「BJWC2010」矩阵距离又是一道需要真正思考了才可以做出来的水题。题目描述给出一个N*M的01矩阵,输出每个0到离这个点最近的1的距离。思考历程暴力由于$N\le10^3$如果在赛场上出现这个题,我们优先考虑暴力。暴力也是很简单,从每个为0的点出发bfs找到与最近的......
  • 28.找出字符串中第一个匹配项的下标——学习笔记
    题目:给你两个字符串 haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果 needle不是haystack的一部分,则返回 -1。示例1:输入:haystack="sadbutsad",needle="sad"输出:0解释:"sad"在下标0和6处匹配。第一个......
  • 远距离数据采集,来一个远程 IO模块搞定!
    远程IO模块主要用于工业现场采集模拟信号和数字信号,而且还可以输出模拟信号和数字信号来控制设备。可以扩展PLC、采集仪器仪表等数据处理设备的输入和输出口,比如一个PLC只有有10个模拟输入接口,但是现场需要采集30个模拟量,就需要加入远程IO扩展。还有,由于设备和主控PLC或工控机可能......
  • 题目中常见的几种距离
    距离在几何学里面距离并不单指直线距离,有很多其他的距离没有那么常用,但考场上可能会出现,为了防止题目不给出定义等,我们有必要认识一下各种距离。后面的角标为了清楚直接打到字母后面了欧几里得距离也被称作欧式距离,在平面直角坐标系中,设有两点\(A(x_{1},y_{1}),B(x_{2},y_{2}......
  • js百度地图计算两经纬度坐标点的距离
    百度地图提供现成的方法,直接调用就可以了Map类getDistance(start:Point,end:Point)Number返回两点之间的距离,单位是米。(自1.1新增)varmap=newBMap.Map("container");varpoint1=newBMap.Point(lng1,lat1);varpoint2=newBMap.Point(lng2,lat2);vardistanc......
  • python计算余弦相似性和汉明距离
    要使用矩阵相乘来计算7个二进制编码之间的余弦相似性,我们需要先将二进制编码转换为数值向量。对于每个二进制编码,我们可以将0映射为-1,将1映射为1,从而得到一个数值向量。然后,我们可以将这些数值向量表示为一个矩阵,并进行矩阵相乘来计算余弦相似性。以下是一个示例代码,使用Python和......
  • 检查相同字母间的距离
    给你一个下标从0开始的字符串s,该字符串仅由小写英文字母组成,s中的每个字母都恰好出现两次。另给你一个下标从0开始、长度为26的的整数数组distance。字母表中的每个字母按从0到25依次编号(即,'a'->0,'b'->1,'c'->2,...,'z'->25)。在一个匀整字符......
  • 计算两个经纬度坐标之间的距离值
    importjava.util.*;importjava.math.*;/***计算两个经纬度坐标之间的距离值*src:https://blog.csdn.net/zhuxiaoping54532/article/details/53671641*/publicclasstest1{privatefinalstaticdoubleEARTH_RADIUS=6378.137;publicstaticvoidm......
  • 代码随想录算法训练营第九天|28. 找出字符串中第一个匹配项的下标、459. 重复的子字符
    【参考链接】28.找出字符串中第一个匹配项的下标【注意】1.kmp解决的就是字符串匹配的问题。2.kmp如何知道匹配过哪些字符串,并跳到匹配过的内容后面的字符。---前缀表3.找到一个子字符串里它的最长相等前后缀。4.前缀是包含首字母,不包含尾字母的所有子串;后缀只包含尾字母,不......