以 C++ 形成兩個給定陣列中元素順序相同的新陣列
問題陳述
給出兩個相同大小的陣列A[]和B[]。任務是形成一個相同大小的第三個陣列。結果陣列應包含來自兩個陣列的最大n個元素。它應按照它們在原始陣列中出現的順序首先選擇A[]的元素,然後選擇B[]的元素。如果有公共元素,則res[]中應僅存在一個元素,且優先考慮A[]。
示例
如果輸入陣列為:
arr1[] = {9, 17, 2, 25, 6}
arr2[] = {17, 4, 8, 10, 1} then final array is:
{9, 17, 25, 8, 10}請注意,元素17是公共元素,並且優先考慮arr1。
演算法
- 建立兩個陣列的副本,並按降序對副本進行排序。
- 使用雜湊來獲取這兩個陣列中n個最大唯一元素,優先考慮arr1[]。
- 初始化空結果陣列。
- 遍歷arr1[],並將雜湊中存在的arr1[]元素複製到結果陣列中。這樣做是為了保持元素順序相同。
- 針對arr2[]重複步驟4。此時,我們僅考慮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
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP