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

หาจำนวนเต็มที่เกิดขึ้นมากที่สุดใน n ช่วงด้วย C++


ในปัญหานี้ เราได้รับ N ช่วง ภารกิจของเราคือ หาจำนวนเต็มที่เกิดขึ้นมากที่สุดใน n ช่วง

สำหรับค่าเริ่มต้นและค่าสิ้นสุดของทุกช่วง เราต้องหาค่าที่เกิดบ่อยที่สุด

มาดูตัวอย่างเพื่อเข้าใจปัญหา

อินพุต

 S1 = 1, E1 = 3 S2 = 2, E2 = 6 S3 = 3, E3 = 4

เอาต์พุต

 2

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

วิธีการง่ายๆ ในการแก้ปัญหาคือการใช้แฮชชิง เราจะใช้ตารางแฮชเพื่อนับสมาชิกทั้งหมดและจำนวนของพวกเขา เราจะเดินทางผ่านทุกช่วงและเก็บจำนวนในตารางแฮช จากนั้นเราจะหาจำนวนสูงสุด

อีกวิธีหนึ่งในการแก้ปัญหาในเวลาเชิงเส้นคือการใช้อาร์เรย์ช่วง ในอาร์เรย์นี้ เราจะอัปเดตดัชนีของค่าเริ่มต้นของทุกช่วงโดยการบวก 1 และค่าสิ้นสุดของทุกช่วงโดยการลบ 1 จากนั้นจะหาผลรวมคำนำหน้า (prefix sum) และหาค่าที่มี prefix sum สูงสุด

ตัวอย่าง

โปรแกรมสาธิตการทำงานของวิธีแก้ปัญหาของเรา

 #include <bits/stdc++.h> #define MAX 1000000 using namespace std; int findMaxOccrEle(int L[], int R[], int n){    int occurenceConut[MAX];    memset(occurenceConut, 0, sizeof occurenceConut);    int maxi = -1;    for (int i = 0; i < n; i++) {       occurenceConut[L[i]] += 1;       occurenceConut[R[i] + 1];       if(R[i]>maxi){          maxi=R[i];       }    }    int prefSum = occurenceConut[0],maxEleIndex;    for (int i = 1; i < maxi+1; i++) {       occurenceConut[i] += occurenceConut[i - 1];       if (prefSum < occurenceConut[i]) {          prefSum = occurenceConut[i];          maxEleIndex = i;       }    }    return maxEleIndex; } int main(){    int L[] = { 1, 2, 3 };    int R[] = { 3, 6, 4 };    int n = sizeof(L) / sizeof(L[0]);    cout<<"The maximum occurred integer in the range is "<<findMaxOccrEle(L, R, n);    return 0; }

เอาต์พุต

The maximum occurred integer in the range is 3