给定一个整数数组,返回所有数对之间的第 k 个最小距离。一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值。
来源:力扣(LeetCode)
快速排序 + 二分查找
int
cmp(int *a, int *b) {
return *a - *b;
}
//计算小于mid的个数
int
count(int *nums, int numsSize, int mid)
{
int slow = numsSize - 1, res = 0;
int fast = numsSize - 2;
for (; fast >= 0; fast --)
{
while (slow > fast && nums[slow] - nums[fast] > mid)
{
slow --;
}
res += slow - fast;
}
return res;
}
int
smallestDistancePair(int* nums, int numsSize, int k)
{
qsort(nums, numsSize, sizeof(int), cmp);
int right = nums[numsSize - 1] - nums[0];
int left = 0;
while (left < right)
{
int mid = (left + right) / 2;
if (count(nums, numsSize, mid) < k)
{
left = mid + 1;
}
else
{
right = mid;
}
}
return left;
}