📅  最后修改于: 2023-12-03 15:09:28.795000             🧑  作者: Mango
这个问题可以通过枚举数组中的所有(i,j)对并检查它们是否满足条件,但这种方法的时间复杂度为O(n^2),n为数组大小。
更好的方法是将数组按升序排序,以便可以处理更多有用的信息。然后,可以使用双指针方法,在O(n log n)时间内确定计数。
具体来说,我们可以将两个指针i和j指向数组的开头。然后,我们移动j,直到| arr [i] - arr [j] |的值小于或等于| arr [i] |的值,这意味着我们已经找到了所有满足|i-j| <=| arr[i]-arr[j] |和| arr[i]+arr[j] |条件的j。 此后,我们可以将答案加上j-i即可。然后我们将指针i向前移动,重复这个过程。
下面是使用python实现的样例代码:
def count_pairs(arr):
arr.sort() # 先将数组排序
n = len(arr)
count = 0
j = 1
for i in range(n-1):
while (j < n and abs(arr[i]) >= abs(arr[j] - arr[i])):
j += 1
count += j - i - 1
return count
arr = [-2, 0, 2, 4]
print(count_pairs(arr)) # 3
该算法的时间复杂度为O(n log n),其中n为数组大小。