Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

สร้าง Maximum Array จากสองอาร์เรย์ โดยรักษาลำดับเดิมใน C++


โจทย์

ได้รับอาร์เรย์สองอันขนาดเท่ากัน A[] และ B[] งานคือสร้างอาร์เรย์ที่สามขนาดเดียวกัน อาร์เรย์ผลลัพธ์ควรมี N องค์ประกอบสูงสุดจากทั้งสองอาร์เรย์ ควรมีองค์ประกอบที่เลือกจาก A[] ก่อน ตามด้วย B[] ในลำดับเดียวกับอาร์เรย์ต้นฉบับ ถ้ามีองค์ประกอบซ้ำ ให้มีเพียงหนึ่งตัวในผลลัพธ์ และให้ความสำคัญกับ A[]

ตัวอย่าง

ถ้าอินพุตอาร์เรย์คือ

arr1[] = {9, 17, 2, 25, 6}
arr2[] = {17, 4, 8, 10, 1}
อาร์เรย์สุดท้ายคือ: {9, 17, 25, 8, 10}

โปรดสังเกตว่า 17 ซ้ำกัน และให้ความสำคัญกับ arr1

อัลกอริทึม

  • สร้างสำเนาของทั้งสองอาร์เรย์และจัดเรียงแบบ Descending
  • ใช้ Hash เพื่อเลือก N องค์ประกอบสูงสุดที่ไม่ซ้ำของทั้งสองอาร์เรย์ ให้ความสำคัญกับ arr1[]
  • เริ่มต้นอาร์เรย์ผลลัพธ์เป็นว่าง
  • ท่อง arr1[] คัดลอกองค์ประกอบที่อยู่ใน Hash (เพื่อรักษาลำดับ)
  • ทำซ้ำขั้นตอน 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