Đề bài
Cho hai mảng A[], B[] cùng kích thước n. Tạo mảng kết quả kích thước n chứa n phần tử lớn nhất duy nhất từ cả hai mảng, ưu tiên phần tử của A[] nếu trùng, và giữ nguyên thứ tự xuất hiện trong mảng gốc.
Ví dụ: A={9,17,2,25,6}, B={17,4,8,10,1} → Kết quả {9,17,25,8,10}. (17 trùng, lấy của A).
Thuật toán
- Sao chép và sắp xếp giảm dần cả hai mảng.
- Dùng hash set chọn n phần tử lớn nhất duy nhất, ưu tiên A (duyệt A trước).
- Duyệt A gốc, lấy phần tử có trong hash → thêm vào kết quả.
- Duyệt B gốc, lấy phần tử có trong hash và chưa lấy từ A → thêm vào kết quả.
Ví dụ minh họa (C++)
#include <bits/stdc++.h>
using namespace std;
void printArray(vector<int>& arr) {
for (int x : arr) cout << x << " ";
cout << endl;
}
void getMaxArray(int* arr1, int* arr2, int n) {
vector<int> t1(arr1, arr1+n), t2(arr2, arr2+n);
sort(t1.begin(), t1.end(), greater<int>());
sort(t2.begin(), t2.end(), greater<int>());
unordered_map<int, int> mp;
int i = 0, j = 0;
while (mp.size() < n) {
if (t1[i] >= t2[j]) mp[t1[i++]]++;
else mp[t2[j++]]++;
}
vector<int> res;
for (int k = 0; k < n; ++k)
if (mp.count(arr1[k])) { res.push_back(arr1[k]); mp.erase(arr1[k]); }
for (int k = 0; k < n; ++k)
if (mp.count(arr2[k])) { res.push_back(arr2[k]); mp.erase(arr2[k]); }
cout << "Mang ket qua: ";
printArray(res);
}
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;
}
Kết quả
Mang ket qua: 9 17 25 8 10