📅  最后修改于: 2023-12-03 14:53:38.174000             🧑  作者: Mango
给定一个整数数组 arr
,其中 $0≤i<j<arr.length$
,且 arr[i]+j=arr[j]+i
。返回能够满足上述条件的不同 (i, j)
对的数量。
这道题使用循环枚举的方法可以解决,时间复杂度为 $O(n^2)$,并且会 TLE。
我们可以利用数学思想来简化问题。首先,我们将等式 arr[i]+j=arr[j]+i
改写成 arr[i]-i=arr[j]-j
。
所以我们需要对数组中所有的 arr[i]-i
进行统计。设包含元素 x
的出现次数为 count[x]
,可以使用哈希表实现。
若 arr[i]-i=x
, arr[j]-j=x
,并且 i<j
,那么这对 (i,j)
就是一个有效的答案,并且出现次数为 count[x] * (count[x]-1) / 2
。
为什么出现次数是这个呢?因为对于每个 x
,我们需要计算它的组合数结果,两者应该是不同的,我们需要进行去重。详细的组合数的公式可以参考专门书籍或者网上资料,请读者自行了解。
def countPairs(arr: List[int]) -> int:
count = defaultdict(int)
res = 0
for i, x in enumerate(arr):
res += count[x - i]
count[x - i] += 1
return res
本题解使用了哈希表统计,处理相对简单,时间复杂度为 $O(n)$,空间复杂度为 $O(n)$。由于采用了一种新思路,本题解相对来说较为简短,但假如读者对哈希表的使用还比较陌生的话,可以在学习完下一道题解后,再来理解此题解,将获得更好的理解效果。