สมมติว่ามีอาร์เรย์ที่แสดงองค์ประกอบของลำดับเลขคณิตตามลำดับ มีองค์ประกอบหนึ่งหายไป เราต้องหาองค์ประกอบที่หายไป ดังนั้นถ้า arr = [2, 4, 8, 10, 12, 14] ผลลัพธ์คือ 6 เพราะ 6 หายไป
ใช้การค้นหาแบบทวิภาค (Binary Search) เราสามารถแก้ปัญหานี้ได้ เราจะไปที่องค์ประกอบกลาง ตรวจสอบว่าความต่างระหว่างกลางและถัดจากกลางเท่ากับความต่างร่วมหรือไม่ หากไม่เท่ากัน องค์ประกอบที่หายไปอยู่ระหว่างดัชนี mid และ mid + 1 หากองค์ประกอบกลางเป็นองค์ประกอบ n/2 ใน AP องค์ประกอบที่หายไปอยู่ในครึ่งขวา มิฉะนั้นอยู่ครึ่งซ้าย
ตัวอย่าง
#include <iostream>
using namespace std;
class Progression {
public:
int missingUtil(int arr[], int left, int right, int diff) {
if (right <= left)
return INT_MAX;
int mid = left + (right - left) / 2;
if (arr[mid + 1] - arr[mid] != diff)
return (arr[mid] + diff);
if (mid > 0 && arr[mid] - arr[mid - 1] != diff)
return (arr[mid - 1] + diff);
if (arr[mid] == arr[0] + mid * diff)
return missingUtil(arr, mid + 1, right, diff);
return missingUtil(arr, left, mid - 1, diff);
}
int missingElement(int arr[], int n) {
int diff = (arr[n - 1] - arr[0]) / n;
return missingUtil(arr, 0, n - 1, diff);
}
};
int main() {
Progression pg;
int arr[] = {2, 4, 8, 10, 12, 14};
int n = sizeof(arr) / sizeof(arr[0]);
cout << "The missing element is: " << pg.missingElement(arr, n);
}
ผลลัพธ์
The missing element is: 6