समस्या विवरण
एक क्रमबद्ध सरणी में फिक्स्ड पॉइंट वह तत्व है जिसका मान उसके सूचकांक के बराबर होता है। सरणी में नकारात्मक संख्याएं और डुप्लिकेट तत्व हो सकते हैं। यदि फिक्स्ड पॉइंट मौजूद है तो उसका मान वापस करें, अन्यथा -1 वापस करें।
हल दृष्टिकोण
बाइनरी खोज का उपयोग करके O(log n) समय में हल करें। डुप्लिकेट तत्वों के लिए सामान्य बाइनरी खोज विफल हो सकती है। संशोधित दृष्टिकोण:
- बाएं जांचने के लिए: min(mid - 1, midValue) से शुरू करें
- दाएं जांचने के लिए: max(mid + 1, midValue) से शुरू करें
उदाहरण कोड
#include <iostream>
#include <algorithm>
using namespace std;
int getFixedPoint(int arr[], int left, int right) {
if (right < left) return -1;
int mid = (left + right) / 2;
int midValue = arr[mid];
if (mid == arr[mid]) return mid;
int leftindex = min(mid - 1, midValue);
int l = getFixedPoint(arr, left, leftindex);
if (l >= 0) return l;
int rightindex = max(mid + 1, midValue);
int r = getFixedPoint(arr, rightindex, right);
return r;
}
int main() {
int arr[] = {-10, -5, 2, 2, 2, 3, 4, 7, 10, 12, 17};
int n = sizeof(arr)/sizeof(arr[0]);
cout << "Fixed Point: " << getFixedPoint(arr, 0, n-1);
return 0;
}
आउटपुट
Fixed Point: 2