ในปัญหานี้ เราได้รับ arr[] ขนาด n งานของเราคือ ค้นหาหมายเลขที่ขาดหายไปในช่วง .
อาร์เรย์ประกอบด้วยค่าทั้งหมดตั้งแต่ค่าที่น้อยที่สุดถึง (น้อยที่สุด + n) องค์ประกอบของช่วงหายไปจากอาร์เรย์ และเราต้องหาค่าที่ขาดหายไปนี้
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล
arr[] = {4, 8, 5, 7}
ผลผลิต
6
แนวทางการแก้ปัญหา
วิธีแก้ปัญหาง่ายๆ คือการค้นหาองค์ประกอบที่ขาดหายไปโดยจัดเรียงอาร์เรย์ จากนั้นค้นหาองค์ประกอบแรกของช่วงโดยเริ่มจากค่าต่ำสุดซึ่งไม่มีอยู่ในอาร์เรย์ แต่มีอยู่ในช่วง
วิธีนี้เป็นวิธีที่ไร้เดียงสาและจะแก้ปัญหาคือความซับซ้อนของเวลา O(n log n)
อีกแนวทางหนึ่งในการแก้ปัญหาในเวลาอันสั้นคือการใช้ XOR ของค่าของอาร์เรย์และช่วง เราจะค้นหา XOR ของค่าทั้งหมดในช่วงและค้นหา XOR ของค่าทั้งหมดในอาร์เรย์ด้วย XOR ของค่าทั้งสองนี้จะเป็นค่าที่หายไปของเรา
ตัวอย่าง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
#include <bits/stdc++.h> using namespace std; int findMissingNumArr(int arr[], int n){ int arrMin = *min_element(arr, arr+n); int numXor = 0; int rangeXor = arrMin; for (int i = 0; i < n; i++) { numXor ^= arr[i]; arrMin++; rangeXor ^= arrMin; } return numXor ^ rangeXor; } int main(){ int arr[] = { 5, 7, 4, 8, 9}; int n = sizeof(arr)/sizeof(arr[0]); cout<<"The missing value in the array is "<<findMissingNumArr(arr, n); return 0; }
ผลลัพธ์
The missing value in the array is 6