समस्या कथन
दो समान आकार के ऐरे A[] और B[] दिए गए हैं। कार्य समान आकार का तीसरा ऐरे बनाना है। परिणाम ऐरे में दोनों ऐरे से अधिकतम n तत्व होने चाहिए। इसमें A[] के चुने हुए तत्व पहले होने चाहिए, फिर B[] के चुने हुए तत्व उसी क्रम में जैसे वे मूल ऐरे में दिखाई देते हैं। यदि सामान्य तत्व हैं, तो res[] में केवल एक तत्व मौजूद होना चाहिए और प्राथमिकता A[] को दी जानी चाहिए।
उदाहरण
यदि इनपुट ऐरे हैं:
arr1[] = {9, 17, 2, 25, 6}
arr2[] = {17, 4, 8, 10, 1}
तब अंतिम ऐरे है: {9, 17, 25, 8, 10}
कृपया ध्यान दें कि तत्व 17 सामान्य है और प्राथमिकता arr1 को दी गई है।
एल्गोरिदम
- दोनों ऐरे की कॉपी बनाएं और कॉपी को अवरोही क्रम में सॉर्ट करें।
- हैश का उपयोग करके दोनों ऐरे के अद्वितीय n अधिकतम तत्व चुनें, arr1[] को प्राथमिकता दें।
- परिणाम ऐरे को खाली प्रारंभ करें।
- arr1[] को पार करें, arr1[] के उन तत्वों को कॉपी करें जो हैश में मौजूद हैं। यह तत्वों के क्रम को समान रखने के लिए किया जाता है।
- चरण 4 को arr2[] के लिए दोहराएं। इस बार केवल उन तत्वों पर विचार करें जो arr1[] में मौजूद नहीं हैं।
उदाहरण
#include <bits/stdc++.h>
using namespace std;
void printArray(vector<int>& arr, int n) {
for (int i = 0; i < n; ++i) {
cout << arr[i] << " ";
}
cout << endl;
}
void getMaxArray(int* arr1, int* arr2, int n) {
vector<int> temp1(arr1, arr1 + n);
vector<int> temp2(arr2, arr2 + n);
sort(temp1.begin(), temp1.end(), greater<int>());
sort(temp2.begin(), temp2.end(), greater<int>());
unordered_map<int, int> m;
int i = 0, j = 0;
while (m.size() < n) {
if (temp1[i] >= temp2[j]) {
m[temp1[i]]++;
++i;
} else {
m[temp2[j]]++;
++j;
}
}
vector<int> result;
for (int i = 0; i < n; ++i) {
if (m.find(arr1[i]) != m.end()) {
result.push_back(arr1[i]);
}
}
for (int i = 0; i < n; ++i) {
if (m.find(arr2[i]) != m.end() && m[arr2[i]] == 1) {
result.push_back(arr2[i]);
}
}
cout << "Final array:\n";
printArray(result, n);
}
int main() {
int arr1[] = {9, 17, 2, 25, 6};
int arr2[] = {17, 4, 8, 10, 1};
int n = sizeof(arr1) / sizeof(arr1[0]);
getMaxArray(arr1, arr2, n);
return 0;
}
आउटपुट
Final array: 9 17 25 8 10