समस्या विवरण
हमें धनात्मक पूर्णांकों का एक ऐरे दिया गया है। लक्ष्य उन जोड़ों (A, B) की गणना करना है जहाँ:
Aकी आवृत्ति कम से कमBहैBकी आवृत्ति कम से कमAहै
उदाहरण
इनपुट: arr[] = {3, 3, 3, 5, 5, 6, 6}
आउटपुट: 1
व्याख्या: केवल (3,3) वैध है।
इनपुट: arr[] = {3, 3, 3, 3, 3, 5, 5, 5, 6, 6}
आउटपुट: 3
व्याख्या: वैध जोड़े: (3,3), (5,5), (3,5)।
दृष्टिकोण
एक अनऑर्डर्ड मैप में सभी तत्वों की आवृत्ति स्टोर करें। फिर मैप को पार करें: प्रत्येक तत्व start और उसकी आवृत्ति end के लिए, 1 से end तक जाँचें कि क्या उस मान की आवृत्ति start से अधिक या बराबर है।
एल्गोरिदम
- आवृत्ति मैप
umबनाएँ - प्रारंभिक
count = 0 - मैप में प्रत्येक
(start, end)जोड़ी के लिए:j = 1सेendतक लूप करें- यदि
um[j] >= startतोcount++
countलौटाएँ
C++ कार्यान्वयन
#include <bits/stdc++.h>
using namespace std;
int frequency_other_value(int arr[], int len) {
int count = 0;
unordered_map<int, int> um;
for (int i = 0; i < len; ++i) um[arr[i]]++;
for (auto& it : um) {
int start = it.first;
int end = it.second;
for (int j = 1; j <= end; j++) {
if (um[j] >= start) count++;
}
}
return count;
}
int main() {
int arr[] = {3, 3, 3, 5, 5, 6, 6};
int size = sizeof(arr) / sizeof(arr[0]);
cout << "Count: " << frequency_other_value(arr, size);
return 0;
}
आउटपुट
Count: 1