समस्या विवरण
एक क्रमबद्ध सरणी में फिक्स्ड पॉइंट वह तत्व है जिसका मान उसके सूचकांक के बराबर होता है। सरणी में नकारात्मक संख्याएं हो सकती हैं। फिक्स्ड पॉइंट मिलने पर उसका मान वापस करें, अन्यथा -1 वापस करें।
हल दृष्टिकोण
मानक बाइनरी खोज का उपयोग करके O(log n) समय में हल करें:
- मध्य तत्व जांचें: यदि mid == arr[mid] तो फिक्स्ड पॉइंट मिल गया
- यदि mid > arr[mid] तो दाईं ओर खोजें
- यदि mid < arr[mid] तो बाईं ओर खोजें
यह दृष्टिकोण तब काम करता है जब सरणी में डुप्लिकेट नहीं होते।
उदाहरण कोड
#include <iostream>
using namespace std;
int getFixedPoint(int arr[], int left, int right) {
if (right >= left) {
int mid = (left + right) / 2;
if (mid == arr[mid]) return mid;
if (mid > arr[mid])
return getFixedPoint(arr, (mid + 1), right);
else
return getFixedPoint(arr, left, (mid - 1));
}
return -1;
}
int main() {
int arr[] = {-10, -1, 0, 3, 10, 11, 9, 50, 56};
int n = sizeof(arr)/sizeof(arr[0]);
cout << "Fixed Point: " << getFixedPoint(arr, 0, n-1);
return 0;
}
आउटपुट
Fixed Point: 3