Find Equal (or Middle) Point in a sorted array with duplicates - GeeksforGeeks

19 May, 2021
Given a sorted array of n size, the task is to find whether an element exists in the array from where the number of smaller elements is equal to the number of greater elements.If Equal Point appears multiple times in input array, return the index of its first occurrence. If doesn’t exist, return -1.Examples :  
Input  : arr[] = {1, 2, 3, 3, 3, 3}
Output : 1
Equal Point is arr[1] which is 2. Number of
elements smaller than 2 and greater than 2 
are same.

Input  : arr[] = {1, 2, 3, 3, 3, 3, 4, 4}
Output : Equal Point does not exist.

Input : arr[] = {1, 2, 3, 4, 4, 5, 6, 6, 6, 7}
Output : 3
First occurrence of equal point is arr[3]
 
A Naive approach is to take every element and count how many elements are smaller than that and then greater element. Then compare if both are equal or not.An Efficient approach is to create an auxiliary array and store all distinct elements in it. If the count of distinct elements is even, then Equal Point does not exist. If count is odd, then the equal point is the middle point of the auxiliary array.Below is implementation of above idea.  
C++
Java
Python 3
C#
PHP
Javascript
// C++ program to find Equal point in a sorted array// which may have many duplicates.#include <bits/stdc++.h>using namespace std; // Returns value of Equal point in a sorted array arr[]// It returns -1 if there is no Equal Point.int findEqualPoint(int arr[], int n){     // To store first indexes of distinct elements of arr[]     int distArr[n];      // Traverse input array and store indexes of first     // occurrences of distinct elements in distArr[]     int i = 0, di = 0;     while (i < n)     {        // This element must be first occurrence of a        // number (this is made sure by below loop),        // so add it to distinct array.        distArr[di++] = i++;         // Avoid all copies of arr[i] and move to next        // distinct element.        while (i<n && arr[i] == arr[i-1])             i++;     }      // di now has total number of distinct elements.     // If di is odd, then equal point exists and is at     // di/2, otherwise return -1.     return (di & 1)? distArr[di>>1] : -1;} // Driver codeint main(){    int arr[] = {1, 2, 3, 4, 4, 5, 6, 6, 6, 7};    int n = sizeof(arr)/sizeof(arr[0]);    int index = findEqualPoint(arr, n);    if (index != -1)        cout << "Equal Point = " << arr[index] ;    else        cout << "Equal Point does not exists";     return 0;}
//Java program to find Equal point in a sorted array// which may have many duplicates. class Test{    // Returns value of Equal point in a sorted array arr[]    // It returns -1 if there is no Equal Point.    static int findEqualPoint(int arr[], int n)    {         // To store first indexes of distinct elements of arr[]         int distArr[] = new int[n];               // Traverse input array and store indexes of first         // occurrences of distinct elements in distArr[]         int i = 0, di = 0;         while (i < n)         {            // This element must be first occurrence of a            // number (this is made sure by below loop),            // so add it to distinct array.            distArr[di++] = i++;                  // Avoid all copies of arr[i] and move to next            // distinct element.            while (i<n && arr[i] == arr[i-1])                 i++;         }               // di now has total number of distinct elements.         // If di is odd, then equal point exists and is at         // di/2, otherwise return -1.         return (di & 1)!=0 ? distArr[di>>1] : -1;    }     // Driver method    public static void main(String args[])    {        int arr[] = {1, 2, 3, 4, 4, 5, 6, 6, 6, 7};                 int index = findEqualPoint(arr, arr.length);        System.out.println(index != -1 ? "Equal Point = " + arr[index]                            : "Equal Point does not exists");    }}
# Python 3 program to find# Equal point in a sorted# array which may have# many duplicates. # Returns value of Equal# point in a sorted array# arr[]. It returns -1 if# there is no Equal Point.def findEqualPoint(arr, n):     # To store first indexes of    # distinct elements of arr[]    distArr = [0] * n     # Traverse input array and    # store indexes of first    # occurrences of distinct    # elements in distArr[]    i = 0    di = 0    while (i < n):             # This element must be        # first occurrence of a        # number (this is made        # sure by below loop),        # so add it to distinct array.        distArr[di] = i        di += 1        i += 1         # Avoid all copies of        # arr[i] and move to        # next distinct element.        while (i < n and               arr[i] == arr[i - 1]):            i += 1         # di now has total number    # of distinct elements.    # If di is odd, then equal    # point exists and is at    # di/2, otherwise return -1.    return distArr[di >> 1] if (di & 1) else -1 # Driver codearr = [1, 2, 3, 4, 4,       5, 6, 6, 6, 7]n = len(arr)index = findEqualPoint(arr, n)if (index != -1):    print("Equal Point = " ,                 arr[index])else:    print("Equal Point does " +                  "not exists") # This code is contributed# by Smitha
// C# program to find Equal// point in a sorted array// which may have many duplicates.using System; class GFG{    // Returns value of Equal point    // in a sorted array arr[]    // It returns -1 if there    // is no Equal Point.    static int findEqualPoint(int []arr,                              int n)    {        // To store first indexes of        // distinct elements of arr[]        int []distArr = new int[n];             // Traverse input array and        // store indexes of first        // occurrences of distinct        // elements in distArr[]        int i = 0, di = 0;        while (i < n)        {            // This element must be            // first occurrence of a            // number (this is made            // sure by below loop),            // so add it to distinct array.            distArr[di++] = i++;                 // Avoid all copies of            // arr[i] and move to            // next distinct element.            while (i < n && arr[i] == arr[i - 1])                i++;        }             // di now has total number        // of distinct elements.        // If di is odd, then equal        // point exists and is at        // di/2, otherwise return -1.        return (di & 1) != 0 ?            distArr[di >> 1] :                           -1;    }     // Driver Code    public static void Main()    {        int []arr = {1, 2, 3, 4, 4,                     5, 6, 6, 6, 7};                 int index = findEqualPoint(arr, arr.Length);        Console.Write(index != -1 ?                      "Equal Point = " + arr[index] :                      "Equal Point does not exists");    }}
<?php// PHP program to find Equal point in a// sorted array which may have many// duplicates. // Returns value of Equal point in a// sorted array arr[] It returns -1// if there is no Equal Point.function findEqualPoint( $arr, $n){    // To store first indexes of distinct    // elements of arr[]    $distArr = array();     // Traverse input array and store    // indexes of first occurrences of    // distinct elements in distArr[]    $i = 0; $di = 0;         while ($i < $n)    {        // This element must be first        // occurrence of a number (this        // is made sure by below loop),        // so add it to distinct array.        $distArr[$di++] = $i++;         // Avoid all copies of arr[i]        // and move to next distinct        // element.        while ($i < $n and                 $arr[$i] == $arr[$i-1])            $i++;    }     // di now has total number of    // distinct elements. If di is odd,    // then equal point exists and is    // at di/2, otherwise return -1.    return ($di & 1)? $distArr[$di>>1] : -1;} // Driver code$arr = array(1, 2, 3, 4, 4, 5, 6, 6, 6, 7);$n = count($arr);$index = findEqualPoint($arr, $n);if ($index != -1)    echo "Equal Point = " , $arr[$index] ;else    echo "Equal Point does not exists"; // This code is contributed by anuj_67.?>
<script>     // JavaScript program to find Equal    // point in a sorted array    // which may have many duplicates.         // Returns value of Equal point    // in a sorted array arr[]    // It returns -1 if there    // is no Equal Point.    function findEqualPoint(arr, n)    {        // To store first indexes of        // distinct elements of arr[]        let distArr = new Array(n);        distArr.fill(0);               // Traverse input array and        // store indexes of first        // occurrences of distinct        // elements in distArr[]        let i = 0, di = 0;        while (i < n)        {            // This element must be            // first occurrence of a            // number (this is made            // sure by below loop),            // so add it to distinct array.            distArr[di++] = i++;                   // Avoid all copies of            // arr[i] and move to            // next distinct element.            while (i < n && arr[i] == arr[i - 1])                i++;        }               // di now has total number        // of distinct elements.        // If di is odd, then equal        // point exists and is at        // di/2, otherwise return -1.        return (di & 1) != 0 ?            distArr[di >> 1] :                           -1;    }         let arr = [1, 2, 3, 4, 4, 5, 6, 6, 6, 7];               let index = findEqualPoint(arr, arr.length);    document.write(index != -1 ?                  "Equal Point = " + arr[index] :                  "Equal Point does not exists");     </script>
Output:  
Equal Point = 4
Time Complexity : O(n) Auxiliary Space : O(n)Space Optimization : We can reduce extra space by traversing the array twice instead of once.  
Count total distinct elements by doing a traversal of input array. Let this count be distCount.If distCount is even, return -1.If distCount is odd, traverse the array again and stop at distCount/2 and return this index.
Count total distinct elements by doing a traversal of input array. Let this count be distCount.
If distCount is even, return -1.
If distCount is odd, traverse the array again and stop at distCount/2 and return this index.
Thanks to Pavan Kumar J S for suggesting this space-optimized approach.This article is contributed by Sahil Chhabra. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
nitin mittal
vt_m
Smitha Dinesh Semwal
shubham_singh
Mukul Mahaliyan
decode2207
Arrays
Arrays
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximum and minimum of an array using minimum number of comparisons
Top 50 Array Coding Problems for Interviews
Stack Data Structure (Introduction and Program)
Introduction to Arrays
Multidimensional Arrays in Java
Linear Search
Linked List vs Array
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
Python | Using 2D arrays/lists the right way
Search an element in a sorted and rotated array