📌  相关文章
📜  对 (arr[i], arr[j]) 的计数,使得 arr[i] + j 和 arr[j] + i 相等(1)

📅  最后修改于: 2023-12-03 14:53:38.174000             🧑  作者: Mango

解决方案详解:对 (arr[i], arr[j]) 的计数,使得 arr[i] + j 和 arr[j] + i 相等

问题描述

给定一个整数数组 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)$。由于采用了一种新思路,本题解相对来说较为简短,但假如读者对哈希表的使用还比较陌生的话,可以在学习完下一道题解后,再来理解此题解,将获得更好的理解效果。