📌  相关文章
📜  从数组中计算对 (i, j) 的数量,使得 arr[i] * j = arr[j] * i(1)

📅  最后修改于: 2023-12-03 15:21:58.822000             🧑  作者: Mango

从数组中计算对 (i, j) 的数量

给定一个整数数组 arr,计算仅包含不同对 (i, j) 的数量,且满足 arr[i] * j = arr[j] * i

解题思路

题目中 arr[i] * j = arr[j] * i 可以转化为 arr[i] / i = arr[j] / j,即求出数组中每个数字的比率,统计每个比率的个数,用排列组合的方法计算不同的组合即可。

  1. 将数组中每个元素计算其比率 arr[i] / i,并将比率存入 map 中统计个数。

  2. 对每个比率的个数进行排列组合,求出组合的数量。

  3. 将组合的数量累加,最终得到结果。

代码实现

以下为使用 Java 语言实现的代码片段:

public int countPairs(int[] arr) {
    Map<Integer, Integer> map = new HashMap<>();
    int ans = 0;
    for (int i = 0; i < arr.length; i++) {
        int rate = arr[i] / i;
        int count = map.getOrDefault(rate, 0);
        ans += i - count;
        map.put(rate, count + 1);
    }
    return ans;
}
时间复杂度

算法的时间复杂度为 $O(n)$,其中 $n$ 为数组的长度,因为需要遍历一次数组并统计比率的个数。