ในปัญหานี้ เราได้รับอาร์เรย์ arr[] ขนาด n และจุดเริ่มต้นและ endelement แสดงถึงช่วง งานของเราคือค้นหาองค์ประกอบที่ขาดหายไปของช่วง
คำอธิบายปัญหา − เราจะหาองค์ประกอบของช่วงที่ไม่มีอยู่ในช่วง
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
arr[] = {4, 6, 3, 7}, start = 3, end = 8
ผลลัพธ์
5, 8
คำอธิบาย
ช่วงคือ [3, 4, 5, 6, 7, 8]
อาร์เรย์คือ {4, 6, 3, 7}
องค์ประกอบของช่วงที่ไม่มีอยู่ในอาร์เรย์คือ 5, 8
แนวทางการแก้ปัญหา
คุณสามารถแก้ปัญหานี้ได้หลายวิธี พวกเขาคือ
#แนวทางที่ 1
วิธีแก้ไขง่ายๆ วิธีหนึ่งคือการตรวจสอบองค์ประกอบทั้งหมดของช่วงในอาร์เรย์โดยตรง สำหรับสิ่งนี้ เราจะจัดเรียงอาร์เรย์แล้วค้นหาองค์ประกอบแรกของช่วงในอาร์เรย์ จากนั้นค้นหาและพิมพ์องค์ประกอบที่ขาดหายไป
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; void findMissingElements(int arr[], int n, int low, int high){ sort(arr, arr + n); int* pointerVal = lower_bound(arr, arr + n, low); int index = pointerVal - arr; int i = index, x = low; while (i < n && x <= high) { if (arr[i] != x) cout << x << " "; else i++; x++; } while (x <= high) cout<<x++<<" "; } int main(){ int arr[] = { 4, 6, 3, 7 }; int n = sizeof(arr) / sizeof(arr[0]); int low = 3, high = 9; cout<<"The missing elements are "; findMissingElements(arr, n, low, high); return 0; }
ผลลัพธ์
The missing elements are 5 8 9
#แนวทางที่ 2
แนวทางอื่นในการแก้ปัญหาคือการใช้อาร์เรย์ เราจะสร้างอาร์เรย์ขนาดบูลีน (สิ้นสุด - เริ่มต้น) สำหรับแต่ละองค์ประกอบของอาร์เรย์นี้ เราจะพบว่า (i+start) มีอยู่ในอาร์เรย์หรือไม่ หากมี ให้ทำเครื่องหมาย arr[i] =true else mark arr[i] =false ในตอนท้าย เราจะสำรวจ booleanArray และพิมพ์องค์ประกอบทั้งหมดที่ทำเครื่องหมายว่าเป็นเท็จ
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; void findMissingElements(int arr[], int n, int start, int end){ bool boolArray[end - start + 1] = { false }; for (int i = 0; i < n; i++) { if (start <= arr[i] && arr[i] <= end) boolArray[arr[i] - start] = true; } for (int i = 0; i <= end - start; i++) { if (boolArray[i] == false) cout<<(start + i)<<"\t"; } } int main(){ int arr[] = { 4, 6, 3, 7 }; int n = sizeof(arr) / sizeof(arr[0]); int low = 3, high = 9; cout<<"The missing elements are "; findMissingElements(arr, n, low, high); return 0; }
ผลลัพธ์
The missing elements are 5 8 9
#แนวทางที่ 3
อีกวิธีในการแก้ปัญหาคือการใช้ตารางแฮช แทรกองค์ประกอบทั้งหมดของอาร์เรย์ลงในตารางแฮช และหลังจากแทรกแล้ว ให้ข้ามช่วงแล้วพิมพ์องค์ประกอบทั้งหมดที่ไม่อยู่ในช่วง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; void findMissingElements(int arr[], int n, int start, int end){ unordered_set<int> arrEle; for (int i = 0; i < n; i++) arrEle.insert(arr[i]); for (int i = start; i <= end; i++) if (arrEle.find(i) == arrEle.end()) cout<<i<<"\t"; } int main(){ int arr[] = { 4, 6, 3, 7 }; int n = sizeof(arr) / sizeof(arr[0]); int low = 3, high = 9; cout<<"The missing elements are "; findMissingElements(arr, n, low, high); return 0; }
ผลลัพธ์
The missing elements are 5 8 9