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

เขียนโปรแกรม C++ เพื่อหาองค์ประกอบที่เกิดบ่อยที่สุด K อันดับแรกในอาร์เรย์ของจำนวนเต็ม

สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มขนาด N และกุญแจ K งานของเราคือพิมพ์องค์ประกอบที่เกิดบ่อยที่สุด K อันดับแรกของอาร์เรย์ ตัวอย่างเช่น

ตัวอย่างอินพุต 1

N = 6, K = 2, arr[] = {1, 1, 1, 2, 2, 3}

เอาต์พุต

1 2

คำอธิบาย

ในอาร์เรย์ของจำนวนเต็มที่กำหนด องค์ประกอบ K=2 อันดับแรกที่ความถี่มากที่สุดในอาร์เรย์คือ {1, 2}

ตัวอย่างอินพุต 2

N = 2, K = 1, arr[] = {1, 2}

เอาต์พุต

1

คำอธิบาย

ในอาร์เรย์ของจำนวนเต็มที่กำหนด องค์ประกอบ K=1 อันดับแรกที่ความถี่มากที่สุดในอาร์เรย์คือ {1}

วิธีการแก้ปัญหา

ในอาร์เรย์ของจำนวนเต็มที่กำหนด เราต้องหาและคืนค่าตัวเลขเหล่านั้นที่ซ้ำมากที่สุดในอาร์เรย์ที่กำหนด กุญแจ K แสดงถึงองค์ประกอบ K อันดับแรกของอาร์เรย์ที่เราต้องคืนค่าขณะวนลูปผ่านอาร์เรย์

วิธีการค่อนข้างง่าย เราจะสร้าง hash table ด้วย key เป็นองค์ประกอบปัจจุบันและ value เป็นจำนวนครั้งที่เกิดขึ้นของตัวเลขนั้นๆ หลังจากจัดเรียงทั้ง map และหาจำนวนครั้งที่เกิดขึ้นของแต่ละองค์ประกอบ คืนค่าผลลัพธ์เอาต์พุทของ K องค์ประกอบที่เกิดบ่อยที่สุด

  • รับ N เป็นอินพุตและอาร์เรย์ของ N องค์ประกอบ
  • ฟังก์ชัน topKfrequent(int *arr, int k) ที่รับ arr[] และกุญแจ K เป็นอินพุตและคืนค่าองค์ประกอบที่เกิดบ่อยที่สุด K อันดับแรก
  • สร้าง hashmap ของทุกองค์ประกอบและจำนวนครั้งที่เกิดขึ้นเป็น key และ pair
  • จัดเรียงค่าทั้งหมดใน hashmap
  • ฟังก์ชัน bool helper ช่วยจัดเรียง map ตามค่าและคืนค่าค่าลำดับลดลง
  • วนลูปผ่านค่าทั้งหมดใน hashmap และคืนค่าองค์ประกอบที่เกิดบ่อยที่สุด K อันดับแรกในอาร์เรย์ที่กำหนด

ตัวอย่างโค้ด

#include <bits/stdc++.h>
using namespace std;

bool compare(pair<int, int> &a, pair<int, int> &b) {
    return a.second > b.second;
}

void topKfrequent(int *arr, int n, int k) {
    unordered_map<int, int> mp;
    for (int i = 0; i < n; i++) {
        mp[arr[i]]++;
    }
    
    vector<pair<int, int>> v(mp.begin(), mp.end());
    sort(v.begin(), v.end(), compare);
    
    for (int i = 0; i < k; i++) {
        cout << v[i].first << " ";
    }
}

int main() {
    int N = 5;
    int arr[N] = {1, 1, 3, 2, 2};
    int k = 2;
    topKfrequent(arr, N, k);
    return 0;
}

ผลลัพธ์

การรันโค้ดด้านบนจะสร้างเอาต์พุตดังนี้

2 1

ในอาร์เรย์ของจำนวนเต็มที่กำหนด องค์ประกอบที่เกิดบ่อยที่สุด K=2 อันดับแรกคือ 2, 1