Find a Fixed Point [Value equal to index] in a given array
Given an array of n distinct integers sorted in ascending order, write a function that returns a Fixed Point in the array, if there is any Fixed Point present in array, else returns -1. Fixed Point in an array is an index i such that arr[i] is equal to i. Note that integers in array can be negative.
Examples:
Recommended: Please solve it on PRACTICE first, before moving on to the solution.
Method 1 [Linear Search]
Linearly search for an index i such that arr[i] == i. Return the first such index found. Thanks to pm for suggesting this solution.
// C++ program to check fixed point // in an array using linear search #include using namespace std; int linearSearch[int arr[], int n] { int i; for [i = 0; i < n; i++] { if [arr[i] == i] return i; } /* If no fixed point present then return -1 */ return -1; } /* Driver code */ int main[] { int arr[] = { -10, -1, 0, 3, 10, 11, 30, 50, 100 }; int n = sizeof[arr] / sizeof[arr[0]]; cout |
// JavaScript program to check fixed point // in an array using linear search function linearSearch[arr, n] { let i; for[i = 0; i < n; i++] { if[arr[i] == i] return i; } /* If no fixed point present then return -1 */ return -1; } // Driver Code let arr = [-10, -1, 0, 3, 10, 11, 30, 50, 100]; let n = arr.length; document.write["Fixed Point is " + linearSearch[arr, n]]; |
Output:
Fixed Point is 3
Time Complexity: O[n]
Method 2 [Binary Search]
First check whether middle element is Fixed Point or not. If it is, then return it; otherwise if the index of middle + 1 element is less than or equal to the value at the high index, then Fixed Point[s] might lie on the right side of the middle point [obviously only if there is a Fixed Point]. Similarly, check if the index of middle 1 element is greater than or equal to the value at the low index, then Fixed Point[s] might lie on the left side of the middle point.
// C++ program to check fixed point // in an array using binary search #include using namespace std; int binarySearch[int arr[], int low, int high] { if [high >= low] { int mid = low + [high - low] / 2; if [mid == arr[mid]] return mid; int res = -1; if [mid + 1 = arr[low]] return binarySearch[arr, low, [mid - 1]]; } /* Return -1 if there is no Fixed Point */ return -1; } /* Driver code */ int main[] { int arr[10] = { -10, -1, 0, 3, 10, 11, 30, 50, 100 }; int n = sizeof[arr] / sizeof[arr[0]]; cout = low] { int mid = low + [high - low] / 2; if [mid == arr[mid]] return mid; int res = -1; if [mid + 1 = arr[low]] return binarySearch[arr, low, [mid - 1]]; } /* Return -1 if there is no Fixed Point */ return -1; } // main function public static void main[String args[]] { int arr[] = { -10, -1, 0, 3, 10, 11, 30, 50, 100 }; int n = arr.length; System.out.println["Fixed Point is " + binarySearch[arr, 0, n - 1]]; } |
# Python program to check fixed point # in an array using binary search def binarySearch[arr, low, high]: if high >= low : mid = low + [high - low]/2 if mid == arr[mid]: return mid res = -1 if mid + 1 = arr[low]: return binarySearch[arr, low, [mid -1]] # Return -1 if there is no Fixed Point return -1 # Driver program to check above functions */ arr = [-10, -1, 0, 3, 10, 11, 30, 50, 100] n = len[arr] print["Fixed Point is " + str[binarySearch[arr, 0, n-1]]] |
// C# program to check fixed point // in an array using binary search using System; class GFG { static int binarySearch[int[] arr, int low, int high] { if [high >= low] { int mid = low + [high - low] / 2; if [mid == arr[mid]] return mid; int res = -1; if [mid + 1 = arr[low]] return binarySearch[arr, low, [mid - 1]]; } /* Return -1 if there is no Fixed Point */ return -1; } // Driver code public static void Main[] { int[] arr = { -10, -1, 0, 3, 10, 11, 30, 50, 100 }; int n = arr.Length; Console.Write["Fixed Point is " + binarySearch[arr, 0, n - 1]]; } |
// javascript program to check fixed point // in an array using binary search function binarySearch[arr,low,high] { if[high >= low] { let mid = math.floor[low + [high - low]/2]; if[mid == arr[mid]] return mid; let res = -1; if[mid+1 = arr[low]] return binarySearch[arr, low, [mid -1]]; } /* Return -1 if there is no Fixed Point */ return -1; } // Driver program let arr = [-10, -1, 0, 3, 10, 11, 30, 50, 100]; let n = arr.length; document.write["Fixed Point is "+ binarySearch[arr, 0, n-1]]; |
Output:
Algorithmic Paradigm: Divide & Conquer
Time Complexity: O[Logn]
Find a Fixed Point [Value equal to index] in a given array | Duplicates Allowed
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.