列表

详情


NC408. 第 K 小的距离对

描述

给定一个长度为 n 的正整数数组 nums ,返回所有距离对中第 k 小的距离。
距离对定位为:两个数组下标 i , j 的差值的绝对值称为距离

数据范围:

示例1

输入:

[1,3,1,5],1

输出:

0

说明:

所有距离对有 (1,3) , (1,1),(1,5) ,(3,1),(3,5),(1,5)。其中最小的是 (1,1) ,其距离是 0

示例2

输入:

[1,3,1,5],2

输出:

2

说明:

所有距离对有 (1,3) , (1,1),(1,5) ,(3,1),(3,5),(1,5)。其中最小的是 (1,3)(其他距离2也是最小),其距离是 2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 7ms, 内存消耗: 776KB, 提交时间: 2022-05-09

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int kthDistance(vector<int>& nums, int k) {
        // write code here
        sort(nums.begin(), nums.end());
        int n = nums.size();
        
        int left = 0, right = nums[n - 1] - nums[0];
        while (left < right) {
            int mid = (left + right) / 2;
            // 以mid为最大距离的个数
            int count = 0;
            int l = 0, r = 0;
            for (; r < n; r++) {
                while (nums[r] - nums[l] > mid) {
                    l++;
                }
                count = count + (r - l);
            }
            // 如果mid为最大距离大于k的话,说明mid不是最优距离,二分查找区间
            if (count >= k) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }
};

C++ 解法, 执行用时: 7ms, 内存消耗: 780KB, 提交时间: 2022-08-03

class Solution {
  public:
    int kthDistance(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end());
        int h = nums.size();
        int L = 0, R = nums[h - 1] - nums[0];
        
        while (L < R) {
            int mid = (L + R) / 2;
            int x = 0, y = 0, z = 0;
            for (; y < h; y++) {
                while (nums[y] - nums[x] > mid) {
                    x++;
                }
                z = z + (y - x);
            }
            if (z >= k) {
                R = mid;
            } else {
                L = mid + 1;
            }
        }
        return L;
    }
};

C++ 解法, 执行用时: 7ms, 内存消耗: 784KB, 提交时间: 2022-08-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int kthDistance(vector<int>& nums, int k) {
        // write code here
        sort(nums.begin(),nums.end());
        int n=nums.size();
        int left=0,right=nums[n-1]-nums[0];
        while(left<right)
        {
            int mid=(left+right)/2;
            int count=0;
            int l=0,r=0;
            for(;r<n;r++)
            {
                while(nums[r]-nums[l]>mid)
                {
                    l++;
                }
             count=count+(r-l);
            }
            if(count>=k)
            {
                right=mid;
            }else{
                left=mid+1;
            }
        }
        return left;
        
    }
};

C++ 解法, 执行用时: 7ms, 内存消耗: 796KB, 提交时间: 2022-05-12

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int kthDistance(vector<int>& nums, int k) {
        // write code here
        sort(nums.begin(),nums.end());
        int l=0;
        int n=nums.size();
        int r=nums[n-1]-nums[0];
        while(l<r)
        {
            int sum=0;
            int mid=(r+l)/2;
            int i=0,j=0;
            for(;i<n;i++)
            {
                while(nums[i]-nums[j]>mid)
                {
                    j++;
                }
                sum+=(i-j);
            }
            if(sum>=k)
                r=mid;
            else
                l=mid+1;
        }
        
        return l;
    }
};

C++ 解法, 执行用时: 7ms, 内存消耗: 812KB, 提交时间: 2022-07-24

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型vector
     * @param k int整型
     * @return int整型
     */
    int kthDistance(vector<int>& nums, int k) {
        // write code here
        sort(nums.begin(), nums.end());
        int n = nums.size();
        int l = 0, r = nums[n - 1] - nums[0];
        while (l < r) {
            int count = 0;
            //以mid为最大距离的个数
            int mid = l + (r - l) / 2;
            int i = 0, j = 0;
            for (; i < n; ++i) {
                while(nums[i] - nums[j] > mid) j++;
                 count += (i - j);
            }    
             // 如果mid为最大距离大于k的话,说明mid不是最优距离,二分查找区间
            if (count >= k) r = mid;
            else l = mid + 1;
        }
        return l;
    }
};

上一题