ในปัญหานี้ เราได้รับ N ช่วง งานของเราคือ จำนวนเต็มที่เกิดขึ้นสูงสุดในช่วง n ช่วง .
สำหรับค่าเริ่มต้นและสิ้นสุดของทุกช่วง เราต้องหาค่าที่เกิดขึ้นให้ได้มากที่สุด
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล
S1 = 1, E1 = 3 S2 = 2, E2 = 6 S3 = 3, E3 = 4
ผลผลิต
2
แนวทางการแก้ปัญหา
วิธีง่ายๆในการแก้ปัญหาคือการใช้แฮช เราจะใช้ตารางแฮชเพื่อนับสมาชิกทั้งหมดและจำนวนสมาชิก เราจะสำรวจทุกช่วงและเก็บจำนวนไว้ในตารางแฮช จากนั้นเราจะหาจำนวนสูงสุด
อีกวิธีหนึ่งในการแก้ปัญหาในเวลาเชิงเส้นคือการใช้อาร์เรย์ช่วง ในอาร์เรย์นี้ เราจะอัปเดตดัชนีของค่าเริ่มต้นทั้งหมดของช่วงโดยการเพิ่ม 1 และค่าสิ้นสุดทั้งหมดของช่วงโดยลบ 1 ออกจากค่านั้น จะค้นหาผลรวมคำนำหน้าและค้นหาค่าผลรวมคำนำหน้าสูงสุด
ตัวอย่าง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
#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