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

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


ในปัญหานี้ เราได้รับ 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