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

หาองค์ปรากฏมากกว่า 25% ในอาร์เรย์เรียงลำดับใน C++

ปัญหา

ได้รับอาร์เรย์ A มีบางตัวซ้ำ ต้องคืนองค์ประกอบที่ปรากฏมากกว่า 25% ของขนาดอาร์เรย์ เช่น A = [1,2,4,4,4,4,5,5,6,6,7,7] → 4 ปรากฏ 4 ครั้ง > 25% ของ 12

วิธีแก้

  • อ่านองค์ประกอบและนับความถี่ (Frequency)
  • ถ้าความถี่ > 25% ของขนาดอาร์เรย์ คืนค่าตัวนั้น

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

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

class Solution {
public:
    int findSpecialInteger(vector<int>& arr) {
        int n = arr.size();
        int req = n / 4;
        unordered_map<int, int> m;
        int ans = -1;
        for (int i = 0; i < n; i++) {
            m[arr[i]]++;
            if (m[arr[i]] > req) ans = arr[i];
        }
        return ans;
    }
};

int main() {
    Solution ob;
    vector<int> c = {1, 2, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7};
    cout << ob.findSpecialInteger(c);
}

อินพุต

[1, 2, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7]

เอาต์พุต

4

คำอธิบาย

ใช้ unordered_map นับความถี่ ขนาดอาร์เรย์ 12 → 25% = 3 ตัวที่ปรากฏ > 3 ครั้งคือคำตอบ (4 ปรากฏ 4 ครั้ง)

เนื่องจากอาร์เรย์เรียงลำดับแล้ว สามารถแก้ได้ O(1) Space โดยเช็ค arr[i] == arr[i + n/4] แต่โค้ดนี้ใช้ Hash Map ทั่วไป