leetcode - 719. Find K-th Smallest Pair Distance

Description

The distance of a pair of integers a and b is defined as the absolute difference between a and b.

Given an integer array nums and an integer k, return the kth smallest distance among all the pairs nums[i] and nums[j] where 0 <= i < j < nums.length.

Example 1:

复制代码
Input: nums = [1,3,1], k = 1
Output: 0
Explanation: Here are all the pairs:
(1,3) -> 2
(1,1) -> 0
(3,1) -> 2
Then the 1st smallest distance pair is (1,1), and its distance is 0.

Example 2:

复制代码
Input: nums = [1,1,1], k = 2
Output: 0

Example 3:

复制代码
Input: nums = [1,6,1], k = 3
Output: 5

Constraints:

复制代码
n == nums.length
2 <= n <= 10^4
0 <= nums[i] <= 10^6
1 <= k <= n * (n - 1) / 2

Solution

Brute Force

Iterate all the possible pairs, then find the shortest distance. Use a max-root heap of size k to keep all the distance we have calculated.

Time complexity: o ( n 2 ) o(n^2) o(n2)

Space complexity: o ( k ) o(k) o(k)

The search range is [0, max(nums) - min(nums)], the difficult part is to find the monotonic part.

For binary search, we need to find a condition that, if condition(k) is True then condition(k + 1) is True.

Consider we have a given distance, there would be a point that, all the distance that is larger than the given distance have more k pairs, and all the distance that is smaller than given distance have less than k pairs.

复制代码
	[d1, d2, d3, d4, d5, d6...]
					  ^

If d5 is our target distance, then d6 and larger distances would have more than k pairs.

So we need a function, with the distance as input, and the output is bool, where it's True if input distance has k or more pairs, and False otherwise.

For this function, we could use 2 pointers. Image we have a fixed index i, and we have j where nums[j] - nums[i] <= distance, we keep moving j to right until nums[j] - nums[i] > distance, then we get j - i - 1 pairs.

Then we move i forward for 1 step, and check if nums[j] - nums[i] <= distance, if so, we keep moving j until it's not.

Keep this process until i reaches the end of the list.

Time complexity: o ( n log ⁡ n ) o(n\log n) o(nlogn), o ( n log ⁡ n ) o(n\log n) o(nlogn) for sorting and binary search, o ( n ) o(n) o(n) for 2 pointers.

Space complexity: o ( 1 ) o(1) o(1)

Code

Brute Force

python3 复制代码
class Solution:
    def smallestDistancePair(self, nums: List[int], k: int) -> int:
        k_small_distance = []
        for i in range(len(nums)):
            for j in range(i + 1, len(nums)):
                distance = abs(nums[i] - nums[j])
                heapq.heappush(k_small_distance, -distance)
                if len(k_small_distance) > k:
                    heapq.heappop(k_small_distance)
        return -min(k_small_distance)
python3 复制代码
class Solution:
    def smallestDistancePair(self, nums: List[int], k: int) -> int:
        def is_enough(distance: int) -> bool:
            """
            Returns:
                True: if there are k or more pairs with the distance or less
                False: if there are less than k pairs with the distance or less
            """
            count = 0
            i, j = 0, 0
            while i < len(nums) or j < len(nums):
                while j < len(nums) and nums[j] - nums[i] <= distance:
                    j += 1
                count += (j - i - 1)
                i += 1
            return count >= k

        nums.sort()
        left, right = 0, nums[-1] - nums[0]
        while left < right:
            mid = (left + right) >> 1
            if is_enough(mid):
                right = mid
            else:
                left = mid + 1
        return (left + right) >> 1
相关推荐
longxibo2 分钟前
【第1章 环境搭建与项目结构解析】
java·后端·流程图
a***72894 分钟前
Java进阶(ElasticSearch的安装与使用)
java·elasticsearch·jenkins
Java成神之路-9 分钟前
面试题:Spring AOP底层实现原理
java·spring aop
Python私教11 分钟前
如意Agent日志系统重构:从 print() 大海捞针到结构化可观测性栈
java·前端·重构
jieyucx16 分钟前
Go 零基础数据结构:顺序表(像「排抽屉」一样学增删改查)
java·数据结构·golang
曦夜日长17 分钟前
C++ STL容器string(一):string的变量细节、默认函数的认识以及常用接口的使用
java·开发语言·c++
想唱rap23 分钟前
应用层协议与序列化
linux·运维·服务器·网络·数据结构·c++·算法
北山有鸟24 分钟前
IS_ERR 判断出错后,再用 PTR_ERR 把它强制转换回 int 型的错误码作为函数的返回值。
java·开发语言
重生之我是Java开发战士28 分钟前
【笔试强训】Week3:重排字符串,分组,DNA序列
算法
We་ct30 分钟前
LeetCode 97. 交错字符串:动态规划详解
前端·算法·leetcode·typescript·动态规划