समस्या विवरण
हमें एक पूर्णांक सरणी दी गई है जहाँ प्रत्येक तत्व [-1000, 1000] रेंज में है। लक्ष्य उन जोड़ों की गणना करना है जिनका औसत भी सरणी में मौजूद हो।
उदाहरण
इनपुट: arr[] = {-1,2,5,-3,8,10}
आउटपुट: 2
व्याख्या: (-1,5) औसत=2, (2,8) औसत=5
इनपुट: arr[] = {1,3,2,5,10,6}
आउटपुट: 3
व्याख्या: (1,3)→2, (1,5)→3, (2,10)→6
दृष्टिकोण
आवृत्ति ऐरे का उपयोग करें (आकार 2001, ऑफसेट 1000 ऋणात्मक संख्याओं के लिए)। प्रत्येक शून्येतर आवृत्ति f के लिए:
f*(f-1)/2जोड़ें (समान संख्याओं का औसत वही संख्या होती है)- हर दूसरी शून्येतर आवृत्ति
jके लिए जाँचें कि क्या(i+j)/2की आवृत्ति > 0 है। यदि हाँ, तोfreq[i]*freq[j]जोड़ें
एल्गोरिदम
N=1000, आवृत्ति ऐरे आकार2*N+1- सरणी से आवृत्ति ऐरे भरें:
freq[arr[i]+N]++ - प्रत्येक इंडेक्स
iके लिए जहाँfreq[i]>0:count += freq[i]*(freq[i]-1)/2j = i+2से 2000 तक स्टेप 2:- यदि
freq[j]>0 && freq[(i+j)/2]>0तोcount += freq[i]*freq[j]
- यदि
countलौटाएँ
C++ कार्यान्वयन
#include <bits/stdc++.h>
using namespace std;
int average_pair(int arr[], int size) {
const int N = 1000;
int freq[2*N+1] = {0};
for (int i = 0; i < size; i++)
freq[arr[i] + N]++;
int count = 0;
for (int i = 0; i <= 2*N; i++) {
if (freq[i] > 0) {
count += freq[i] * (freq[i] - 1) / 2;
for (int j = i + 2; j <= 2*N; j += 2) {
if (freq[j] > 0 && freq[(i+j)/2] > 0)
count += freq[i] * freq[j];
}
}
}
return count;
}
int main() {
int arr[] = {2, 3, 1, 8, 9, 10};
int size = sizeof(arr) / sizeof(arr[0]);
cout << "Count: " << average_pair(arr, size);
return 0;
}
आउटपुट
Count: 2