以 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

更新時間:31-12-2019

124 瀏覽

開啟你的 職業

透過完成課程獲得認證

開始
廣告
© . All rights reserved.