ในปัญหานี้ เราได้รับอาร์เรย์ arr[] ขนาด n และคิวรี Q แต่ละอันประกอบด้วยสององค์ประกอบ l และ r งานของเราคือการสร้างโปรแกรมเพื่อแก้ปัญหาการสืบค้นสำหรับจำนวนองค์ประกอบที่แตกต่างกันในอาร์เรย์ย่อยใน C++
คำอธิบายปัญหา − สำหรับแต่ละแบบสอบถาม เราจำเป็นต้องค้นหาจำนวนเต็มที่แตกต่างกันในอาร์เรย์ย่อยโดยเริ่มจาก arr[l] ถึง arr[r]
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
arr[] = {5, 6, 1, 6, 5, 2, 1}
Q = 2
{{1, 4}, {0, 6}} ผลลัพธ์
3 4
คำอธิบาย
สำหรับข้อความค้นหา 1:l =1 และ r =4, subarray[1...4] ={6, 1, 6, 5}, องค์ประกอบที่แตกต่างกัน =3
สำหรับข้อความค้นหา 2 − l =0 และ r =6, subarray[0...6] ={5, 6, 1, 6, 5, 2, 1}, องค์ประกอบที่แตกต่างกัน =4
แนวทางการแก้ปัญหา
ในการแก้ปัญหา เราจะใช้โครงสร้างข้อมูลชุด ซึ่งความยาวจะให้จำนวนองค์ประกอบที่แตกต่างกันของอาร์เรย์สำหรับช่วงที่ระบุในแบบสอบถาม สำหรับแต่ละแบบสอบถาม เราจะแทรกองค์ประกอบทั้งหมดของช่วงในอาร์เรย์ไปยังชุด องค์ประกอบที่ซ้ำกันทั้งหมดของ subarray จะถูกละทิ้งและจะเก็บเฉพาะองค์ประกอบที่แตกต่างกัน ดังนั้นขนาดของชุดจะให้จำนวนองค์ประกอบที่แตกต่างกัน
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include<bits/stdc++.h>
using namespace std;
int solveQuery(int arr[], int l, int r) {
set<int> distElements;
for (int i = (r); i >= (l); i--)
distElements.insert(arr[i]);
return distElements.size();
}
int main() {
int arr[] = {5, 6, 1, 6, 5, 2, 1};
int n = sizeof(arr)/sizeof(arr[0]);
int Q = 2;
int query[Q][2] = {{1, 4}, {0,6}};
for(int i = 0; i < Q; i++)
cout<<"For Query "<<(i+1)<<": The number of distinct elements in subarray is "<<solveQuery(arr, query[i][0], query[i][1])<<"\n";
return 0;
} ผลลัพธ์
For Query 1: The number of distinct elements in subarray is 3 For Query 2: The number of distinct elements in subarray is 4