📅  最后修改于: 2023-12-03 15:21:58.822000             🧑  作者: Mango
给定一个整数数组 arr
,计算仅包含不同对 (i, j)
的数量,且满足 arr[i] * j = arr[j] * i
。
题目中 arr[i] * j = arr[j] * i
可以转化为 arr[i] / i = arr[j] / j
,即求出数组中每个数字的比率,统计每个比率的个数,用排列组合的方法计算不同的组合即可。
将数组中每个元素计算其比率 arr[i] / i
,并将比率存入 map
中统计个数。
对每个比率的个数进行排列组合,求出组合的数量。
将组合的数量累加,最终得到结果。
以下为使用 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$ 为数组的长度,因为需要遍历一次数组并统计比率的个数。