📅  最后修改于: 2023-12-03 15:09:28.833000             🧑  作者: Mango
在一个长度为n的整数数组中,对数有很多。这个问题要求计数所有在这个数组中具有绝对差大于等于k的数对。
最直接的想法是O(n^2)枚举所有数对并判断其绝对差是否大于等于k。但当n很大时这个算法太慢了。我们需要更高效的方法。
为了更高效地计数,我们可以首先将数组进行排序。然后对于每一个数x,它的配对数就是在数组中只需找到第一个大于等于x+k的数,那么x与x+k,x+2k,...,x+nk这些数都可以满足条件。这样的查询可以使用二分查找算法在O(log n)的时间内完成。
def count_pairs(arr, k):
arr.sort()
n = len(arr)
count = 0
for i in range(n):
j = i + 1
while j < n and arr[j] - arr[i] < k:
j += 1
count += n - j
return count
排序数组的时间复杂度大致为O(n log n),每个数的查找时间复杂度为O(log n),所以总时间复杂度为O(n log n)。
这个算法使用了O(1)的额外空间(只使用了几个变量)。