Wednesday, 27 Oct 2021

# Count pairs of equal elements possible by excluding each array element once

Given an array arr[] of N integers, the task for each array element is to find the number of ways of choosing a pair of two equal elements excluding the current element.
Examples:

Input: arr[] = {1, 1, 2, 1, 2}Output: 2 2 3 2 3Explanation: For arr (= 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): The remaining array elements are {1, 2, 1, 2}. Therefore, count is 2.For arr (= 2): The remaining array elements are {1, 1, 1, 2}. Possible choice of pairs are (arr, arr), (arr, arr) and (arr, arr). Therefore, count is 3.For arr (= 1): The remaining elements are {1, 1, 2, 2}. Therefore, count is 2.For arr (= 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

Naive Approach: The simplest approach to solve this problem is to traverse the array for each array element, count all possible pairs of equal elements from the remaining array.Time Complexity: O(N3)  Auxiliary Space: O(1)
Efficient Approach: The above approach can be optimized based on the observation that, for any ith index (1 ≤ i ≤ N), calculate the following two values:The number of ways to choose two distinct elements having equal values from the array.
The number of ways to choose an element from the N − 1 array elements other than the ith element such that their values are the same as the value of the ith element.
Follow the steps below to solve the problem:
Initialize a map, say mp, to store the frequency of every array element.
Traverse the map to count the number of pairs made up of equal values. Store the count in a variable, say total.
Traverse the array and for every ith index, print total – (mp[arr[i]] – 1) as the required answer.
Below is the implementation of the above approach:

C++

#include
using namespace std;

void countEqualElementPairs(int arr[], int N)
{

unordered_map mp;

for (int i = 0; i < N; i++) {         mp[arr[i]] += 1;     }             int total = 0;             for (auto i : mp) {                                       total += (i.second * (i.second - 1)) / 2;     }             for (int i = 0; i < N; i++) {                              cout