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

数对 (a,b) 由整数 a 和 b 组成,其数对距离定义为 a 和 b 的绝对差值。

给你一个整数数组 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

提示:

n == nums.length

2 <= n <= 104^44

0 <= nums[i] <= 106^66

1 <= k <= n * (n - 1) / 2

二分答案,二分下界为0,上界为nums中的最大数对距离,对于二分到的值,查看是否是第k小的数对距离,这可以用滑动窗口来计算:

cpp 复制代码
class Solution {
public:
    int smallestDistancePair(vector<int>& nums, int k) {
        ranges::sort(nums);

        int l = 0;
        int r = nums[nums.size() - 1] - nums[0];

        int ans = 0;

        while (l <= r) {
            int m = l + (r - l) / 2;

            int num = 0;

            int left = 0;
            int right = 0;
            while (right < nums.size()) {
                while (nums[right] - nums[left] > m) {
                    ++left;
                }

                num += right - left;
                ++right;

                if (num >= k) {
                    break;
                }
            }

            if (num >= k) {
                ans = m;
                r = m - 1;
            } else {
                l = m + 1;
            }
        }

        return ans;
    }
};

如果二分的上下界之差为n,nums的长度为m,则此算法时间复杂度为O(m(logm+logn)),空间复杂度为O(logm)。

相关推荐
开开心心就好1 天前
安卓免费证件照制作软件,无广告弹窗
linux·运维·安全·pdf·迭代器模式·依赖倒置原则·1024程序员节
开开心心就好6 天前
轻量级PDF阅读器,仅几M大小打开秒开
linux·运维·服务器·安全·pdf·1024程序员节·oneflow
学传打活10 天前
【边打字.边学昆仑正义文化】_12_生命价值的体现(1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
开开心心就好11 天前
小巧绿色免费关机工具,支持定时倒计时
linux·运维·服务器·安全·powerpoint·1024程序员节·foxmail
开开心心就好12 天前
跨平台高速下载工具,支持浏览器功能强大
运维·服务器·windows·pdf·旅游·媒体·1024程序员节
开开心心就好1 个月前
内存清理软件灵活设置,自动阈值快捷键清
运维·服务器·windows·pdf·harmonyos·risc-v·1024程序员节
学传打活1 个月前
【边打字.边学昆仑正义文化】_5_宇宙物种创造简史(1)
微信公众平台·1024程序员节·汉字·昆伦正义文化
xcLeigh1 个月前
打破机房围墙:VMware+cpolar构建跨网络虚拟实验室
vmware·内网穿透·cpolar·实验室·远程访问·1024程序员节
开开心心就好1 个月前
免费轻量电子书阅读器,多系统记笔记听书
linux·运维·服务器·安全·ddos·可信计算技术·1024程序员节