原文地址:Count of index pairs with equal elements in an array
已知一个数组有n个元素,任务是计算下标
(i,j)
的总数,其中arr[i] = arr[j]
并且i != j
。
例子:
输入:arr[] = {1, 1, 2}
输出:1
因为arr[0] = arr[1],所以下标对是(0, 1)
输入:arr[] = {1, 1, 1}
输出:3
因为arr[0] = arr[1],所以下标对是(0, 1),(0, 2)与(1, 2)
输入:arr[] = {1, 2, 3}
输出:0
方法一(暴力法):
对于每个下标i,找到在数组中它后面的与其值相同的元素。下面是C++的实现:
// C++ program to count of pairs with equal
// elements in an array.
#include<bits/stdc++.h>
using namespace std;
// Return the number of pairs with equal values.
int countPairs(int arr[], int n)
{
int ans = 0;
// for each index i and j
for (int i = 0; i < n; i++)
for (int j = i+1; j < n; j++)
// finding the index with same
// value but different index.
if (arr[i] == arr[j])
ans++;
return ans;
}
// Driven Program
int main()
{
int arr[] = { 1, 1, 2 };
int n = sizeof(arr)/sizeof(arr[0]);
cout << countPairs(arr, n) << endl;
return 0;
}
输出:
1
时间复杂度: O(n2)
方法二 (更高效一些):
这个方法是计算每个元素出现的频率,然后找到相同元素对的数目。假设一个元素
x
在位置arr[i] = arr[j] = x
选择
C2n
次。
下面是这个方法的C++实现:
// C++ program to count of index pairs with
// equal elements in an array.
#include<bits/stdc++.h>
using namespace std;
// Return the number of pairs with equal values.
int countPairs(int arr[], int n)
{
unordered_map<int, int> mp;
// Finding frequency of each number.
for (int i = 0; i < n; i++)
mp[arr[i]]++;
// Calculating pairs of each value.
int ans = 0;
for (auto it=mp.begin(); it!=mp.end(); it++)
{
int count = it->second;
ans += (count * (count - 1))/2;
}
return ans;
}
// Driven Program
int main()
{
int arr[] = {1, 1, 2};
int n = sizeof(arr)/sizeof(arr[0]);
cout << countPairs(arr, n) << endl;
return 0;
}
输出:
1
时间复杂度:O(n)
来源: