# Find a Fixed Point (Value equal to index) in a given array | Duplicates Allowed

Given an array of n 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:

```  Input: arr[] = {-10, -5, 0, 3, 7}
Output: 3  // arr == 3

Input: arr[] = {-10, -5, 2, 2, 2, 3, 4, 7, 9, 12, 13}
Output: 2  // arr == 2

Input: arr[] = {-10, -5, 3, 4, 7, 9}
Output: -1  // No Fixed Point
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

We have a solution to find fixed point in an array of distinct elements. In this post, solution for array with duplicate values is discussed.

Consider the arr[] = {-10, -5, 2, 2, 2, 3, 4, 7, 9, 12, 13}, arr[mid] = 3

If elements are not distinct, then we see arr[mid] < mid, we cannot conclude which side the fixed is on. It could be on left side or on the right side.

We know for sure that since arr = 3, arr couldn't be magic index because arr must be less than or equal to arr (the array is Sorted).

So, the general pattern of our search would be:

• Left Side: start = start, end = min(arr[midIndex], midIndex-1)
• Right Side: start = max(arr[midIndex], midIndex+1), end = end

Below is the code for above Algorithm.

 `// CPP Program to find magic index. ` `#include ` `using` `namespace` `std; ` ` `  `int` `magicIndex(``int``* arr, ``int` `start, ``int` `end) ` `{ ` `    ``// If No Magic Index return -1; ` `    ``if` `(start > end) ` `        ``return` `-1; ` ` `  `    ``int` `midIndex = (start + end) / 2; ` `    ``int` `midValue = arr[midIndex]; ` ` `  `    ``// Magic Index Found, return it. ` `    ``if` `(midIndex == midValue) ` `        ``return` `midIndex; ` ` `  `    ``// Search on Left side ` `    ``int` `left = magicIndex(arr, start, min(midValue,  ` `                                     ``midIndex - 1)); ` ` `  `    ``// If Found on left side, return. ` `    ``if` `(left >= 0) ` `        ``return` `left; ` ` `  `    ``// Return ans from right side. ` `    ``return` `magicIndex(arr, max(midValue, midIndex + 1), ` `                                                  ``end); ` `} ` ` `  `// Driver program ` `int` `main() ` `{ ` `    ``int` `arr[] = { -10, -5, 2, 2, 2, 3, 4, 7, ` `                                 ``9, 12, 13 }; ` `    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr); ` `    ``int` `index = magicIndex(arr, 0, n - 1); ` `    ``if` `(index == -1) ` `        ``cout << ``"No Magic Index"``; ` `    ``else` `        ``cout << ``"Magic Index is : "` `<< index; ` `    ``return` `0; ` `} `

 `// Java Program to find magic index. ` ` `  `class` `GFG { ` `     `  `    ``static` `int` `magicIndex(``int` `arr[], ``int` `start, ``int` `end) ` `    ``{ ` `        ``// If No Magic Index return -1; ` `        ``if` `(start > end) ` `            ``return` `-``1``; ` `     `  `        ``int` `midIndex = (start + end) / ``2``; ` `        ``int` `midValue = arr[midIndex]; ` `     `  `        ``// Magic Index Found, return it. ` `        ``if` `(midIndex == midValue) ` `            ``return` `midIndex; ` `     `  `        ``// Search on Left side ` `        ``int` `left = magicIndex(arr, start, Math.min(midValue, ` `                                            ``midIndex - ``1``)); ` `     `  `        ``// If Found on left side, return. ` `        ``if` `(left >= ``0``) ` `            ``return` `left; ` `     `  `        ``// Return ans from right side. ` `        ``return` `magicIndex(arr, Math.max(midValue,  ` `                                ``midIndex + ``1``),end); ` `    ``} ` ` `  `    ``// Driver code ` `    ``public` `static` `void` `main (String[] args)  ` `    ``{ ` `        ``int` `arr[] = { -``10``, -``5``, ``2``, ``2``, ``2``, ``3``, ``4``, ``7``, ` `                    ``9``, ``12``, ``13` `}; ` `        ``int` `n = arr.length; ` `        ``int` `index = magicIndex(arr, ``0``, n - ``1``); ` `        ``if` `(index == -``1``) ` `            ``System.out.print(``"No Magic Index"``); ` `        ``else` `            ``System.out.print(``"Magic Index is : "``+index); ` `    ``} ` `} ` ` `  `// This code is contributed by Anant Agarwal. `

 `# Python 3 Program to find ` `# magic index. ` ` `  `def` `magicIndex(arr, start, end): ` ` `  `    ``# If No Magic Index return -1  ` `    ``if` `(start > end): ` `        ``return` `-``1` ` `  `    ``midIndex ``=` `int``((start ``+` `end) ``/` `2``)  ` `    ``midValue ``=` `arr[midIndex]  ` ` `  `    ``# Magic Index Found, return it. ` `    ``if` `(midIndex ``=``=` `midValue): ` `        ``return` `midIndex  ` ` `  `    ``# Search on Left side ` `    ``left ``=` `magicIndex(arr, start, ``min``(midValue, ` `                                ``midIndex ``-` `1``))  ` ` `  `    ``# If Found on left side, return. ` `    ``if` `(left >``=` `0``): ` `        ``return` `left  ` ` `  `    ``# Return ans from right side. ` `    ``return` `magicIndex(arr, ``max``(midValue, ` `                        ``midIndex ``+` `1``), ` `                                    ``end)  ` ` `  `# Driver program ` `arr ``=` `[``-``10``, ``-``5``, ``2``, ``2``, ``2``, ``3``, ``4``, ``7``, ``9``, ``12``, ``13``]  ` `n ``=` `len``(arr)  ` ` `  `index ``=` `magicIndex(arr, ``0``, n ``-` `1``)  ` ` `  `if` `(index ``=``=` `-``1``): ` `    ``print``(``"No Magic Index"``)  ` `else``: ` `    ``print``(``"Magic Index is :"``, index)  ` ` `  `# This code is contributed by Smitha Dinesh Semwal `

 `// C# Program to find magic index. ` `using` `System; ` ` `  `class` `GFG { ` `     `  `    ``static` `int` `magicIndex(``int` `[]arr, ``int` `start,  ` `                                    ``int` `end) ` `    ``{ ` `        ``// If No Magic Index return -1; ` `        ``if` `(start > end) ` `            ``return` `-1; ` `     `  `        ``int` `midIndex = (start + end) / 2; ` `        ``int` `midValue = arr[midIndex]; ` `     `  `        ``// Magic Index Found, return it. ` `        ``if` `(midIndex == midValue) ` `            ``return` `midIndex; ` `     `  `        ``// Search on Left side ` `        ``int` `left = magicIndex(arr, start, Math.Min(midValue, ` `                                            ``midIndex - 1)); ` `     `  `        ``// If Found on left side, return. ` `        ``if` `(left >= 0) ` `            ``return` `left; ` `     `  `        ``// Return ans from right side. ` `        ``return` `magicIndex(arr, Math.Max(midValue,  ` `                                ``midIndex + 1),end); ` `    ``} ` ` `  `    ``// Driver code ` `    ``public` `static` `void` `Main ()  ` `    ``{ ` `        ``int` `[]arr = { -10, -5, 2, 2, 2, 3,  ` `                        ``4, 7, 9, 12, 13 }; ` `         `  `        ``int` `n = arr.Length; ` `         `  `        ``int` `index = magicIndex(arr, 0, n - 1); ` `         `  `        ``if` `(index == -1) ` `            ``Console.WriteLine(``"No Magic Index"``); ` `        ``else` `            ``Console.WriteLine(``"Magic Index is : "` `+ ` `                                            ``index); ` `    ``} ` `} ` ` `  `// This code is contributed by vt_m. `

 ` ``\$end``) ` `        ``return` `-1; ` ` `  `    ``\$midIndex` `= ``floor``((``\$start` `+ ``\$end``) / 2); ` `    ``\$midValue` `= ``\$arr``[``\$midIndex``]; ` ` `  `    ``// Magic Index Found, return it. ` `    ``if` `(``\$midIndex` `== ``\$midValue``) ` `        ``return` `\$midIndex``; ` ` `  `    ``// Search on Left side ` `    ``\$left` `= magicIndex(``\$arr``, ``\$start``,  ` `            ``min(``\$midValue``, ``\$midIndex` `- 1)); ` ` `  `    ``// If Found on left side, return. ` `    ``if` `(``\$left` `>= 0) ` `        ``return` `\$left``; ` ` `  `    ``// Return ans from right side. ` `    ``return` `magicIndex(``\$arr``, max(``\$midValue``,  ` `                     ``\$midIndex` `+ 1), ``\$end``); ` `} ` `     `  `    ``// Driver Code ` `    ``\$arr` `= ``array``(-10, -5, 2, 2, 2, 3, ` `                     ``4, 7, 9, 12, 13); ` `    ``\$n` `= sizeof(``\$arr``); ` `    ``\$index` `= magicIndex(``\$arr``, 0, ``\$n` `- 1); ` `    ``if` `(``\$index` `== -1) ` `        ``echo` `"No Magic Index"``; ` `    ``else` `        ``echo` `"Magic Index is : "` `, ``\$index``; ` `     `  `// This code is contributed by nitin mittal ` `?> `

Output:
```Magic Index is : 2
```

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

A Coding Enthusiast Rails Developer

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Article Tags :
Practice Tags :