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

แบบสอบถามสำหรับจำนวนขององค์ประกอบที่แตกต่างกันในอาร์เรย์ย่อยใน C++


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