给定N个整数的数组arr [] ,每个数组元素的任务是找到选择一对除当前元素之外的两个相等元素对的方式的数量。
例子:
Input: arr[] = {1, 1, 2, 1, 2}
Output: 2 2 3 2 3
Explanation:
For arr[0] (= 1): The remaining array elements are {1, 2, 1, 2}. Possible choice of pairs are (1, 1), (2, 2). Therefore, count is 2.
For arr[1] (= 1): The remaining array elements are {1, 2, 1, 2}. Therefore, count is 2.
For arr[2] (= 2): The remaining array elements are {1, 1, 1, 2}. Possible choice of pairs are (arr[0], arr[1]), (arr[1], arr[2]) and (arr[0], arr[2]). Therefore, count is 3.
For arr[3] (= 1): The remaining elements are {1, 1, 2, 2}. Therefore, count is 2.
For arr[4] (= 2): The remaining elements are {1, 1, 2, 1}. Therefore, count is 3.
Input: arr[] = {1, 2, 1, 4, 2, 1, 4, 1}
Output: 5 7 5 7 7 5 7 5
天真的方法:解决此问题的最简单方法是遍历每个数组元素的数组,计算剩余数组中所有可能的相等元素对。
时间复杂度: O(N 3 )
辅助空间: O(1)
高效方法:可以基于以下观察条件对上述方法进行优化:对于任何第i个索引(1≤i≤N),计算以下两个值:
- 从数组中选择具有相等值的两个不同元素的方式的数量。
- 从第i个元素以外的N − 1个数组元素中选择一个元素,以使其值与第i个元素的值相同的方式的数目。
请按照以下步骤解决问题:
- 初始化一个映射,例如mp ,以存储每个数组元素的频率。
- 遍历地图以计算由相等值组成的对的数量。将计数存储在一个变量中,例如total 。
- 遍历数组,并为每个第i个索引,打印total –(mp [arr [i]] – 1)作为要求的答案。
下面是上述方法的实现:
C++
Java
Python3
C#
时间复杂度: O(N)
辅助空间: O(N)