Open In App

Find Surpasser Count of each element in array

Last Updated : 02 Mar, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

A surpasser of an element of an array is a greater element to its right, therefore x[j] is a surpasser of x[i] if i < j and x[i] < x[j]. The surpasser count of an element is the number of surpassers. Given an array of distinct integers, for each element of the array find its surpasser count i.e. count the number of elements to the right that are greater than that element.

Examples : 

Input:  [2, 7, 5, 3, 0, 8, 1]
Output: [4, 1, 1, 1, 2, 0, 0]
Recommended Practice

Method 1 (Naive): The naive solution would be to run two loops. For each element of the array, we count all elements greater than it to its right. The complexity of this solution is O(n2

Implementation:

C++




// Naive C++ program to find surpasser count of
// each element in array
#include <bits/stdc++.h>
using namespace std;
 
// Function to find surpasser count of each element
// in array
void findSurpasser(int arr[], int n)
{
    for (int i = 0; i < n; i++)
    {
        // stores surpasser count for element arr[i]
        int count = 0;
        for (int j = i + 1; j < n; j++)
            if (arr[j] > arr[i])
                count++;
 
        cout << count << " ";
    }
}
 
/* Function to print an array */
void printArray(int arr[], int n)
{
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
}
 
/* Driver program to test above functions */
int main()
{
    int arr[] = { 2, 7, 5, 3, 0, 8, 1 };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    printf("Given array is \n");
    printArray(arr, n);
 
    printf("Surpasser Count of array is \n");
    findSurpasser(arr, n);
 
    return 0;
}


Java




// Naive Java program to find surpasser count
// of each element in array
import java.io.*;
 
class GFG {
 
    // Function to find surpasser count of
    // each element in array
    static void findSurpasser(int arr[], int n)
    {
        for (int i = 0; i < n; i++)
        {
             
            // stores surpasser count for
            // element arr[i]
            int count = 0;
            for (int j = i + 1; j < n; j++)
                if (arr[j] > arr[i])
                    count++;
     
            System.out.print(count +" ");
        }
    }
     
    /* Function to print an array */
    static void printArray(int arr[], int n)
    {
        for (int i = 0; i < n; i++)
            System.out.print( arr[i] + " ");
             
        System.out.println();
    }
     
    // Driver program to test above functions
    public static void main (String[] args)
    {
        int arr[] = { 2, 7, 5, 3, 0, 8, 1 };
        int n = arr.length;
     
        System.out.println("Given array is ");
        printArray(arr, n);
     
        System.out.println("Surpasser Count of"
                               + " array is ");
        findSurpasser(arr, n);
    }
}
 
// This code is contributed by Anuj_67.


Python3




# Naive Python3 program to find
# surpasser count of each element in array
 
# Function to find surpasser count of
# each element in array
def findSurpasser(arr, n):
 
    for i in range(0, n):
     
        # stores surpasser count for element
        # arr[i]
        count = 0;
 
        for j in range (i + 1, n):
            if (arr[j] > arr[i]):
                count += 1
 
        print(count, end = " ")
 
 
# Function to print an array
def printArray(arr, n):
 
    for i in range(0, n):
        print(arr[i], end = " ")
     
# Driver program to test above functions
arr = [2, 7, 5, 3, 0, 8, 1 ]
n = len(arr)
 
print("Given array is")
printArray(arr , n)
 
print("\nSurpasser Count of array is");
findSurpasser(arr , n)
 
# This code is contributed by Smitha Dinesh Semwal


C#




// Naive C# program to find surpasser count
// of each element in array
using System;
 
class GFG {
 
    // Function to find surpasser count of
    // each element in array
    static void findSurpasser(int []arr, int n)
    {
        for (int i = 0; i < n; i++)
        {
             
            // stores surpasser count for
            // element arr[i]
            int count = 0;
            for (int j = i + 1; j < n; j++)
                if (arr[j] > arr[i])
                    count++;
     
            Console.Write(count + " ");
        }
    }
     
    /* Function to print an array */
    static void printArray(int []arr, int n)
    {
        for (int i = 0; i < n; i++)
            Console.Write( arr[i] + " ");
             
        Console.WriteLine();
    }
     
    // Driver program to test above functions
    public static void Main ()
    {
        int []arr = { 2, 7, 5, 3, 0, 8, 1 };
        int n = arr.Length;
     
        Console.WriteLine("Given array is ");
        printArray(arr, n);
     
        Console.WriteLine("Surpasser Count of"
                            + " array is ");
        findSurpasser(arr, n);
    }
}
 
// This code is contributed by Anuj_67.


PHP




<?php
// Naive PHP program to find
// surpasser count of each
// element in array
 
// Function to find surpasser
// count of each element in array
function findSurpasser($arr, $n)
{
    for ( $i = 0; $i < $n; $i++)
    {
        // stores surpasser count
        // for element arr[i]
        $count = 0;
        for ( $j = $i + 1; $j < $n; $j++)
            if ($arr[$j] > $arr[$i])
                $count++;
 
        echo $count , " ";
    }
}
 
/* Function to print an array */
function printArray( $arr, $n)
{
    for ( $i = 0; $i < $n; $i++)
        echo $arr[$i]," ";
        echo "\n";
}
 
// Driver Code
$arr = array( 2, 7, 5, 3, 0, 8, 1 );
$n = count($arr);
 
echo "Given array is \n";
printArray($arr, $n);
 
echo "Surpasser Count of array is \n";
findSurpasser($arr, $n);
 
// This code is contributed by Anuj_67.
?>


Javascript




<script>
 
// Naive Javascript program to find surpasser count
// of each element in array
 
    // Function to find surpasser count of
    // each element in array
    function findSurpasser(arr, n)
    {
        for (let i = 0; i < n; i++)
        {
               
            // stores surpasser count for
            // element arr[i]
            let count = 0;
            for (let j = i + 1; j < n; j++)
                if (arr[j] > arr[i])
                    count++;
       
            document.write(count +" ");
        }
    }
       
    /* Function to print an array */
    function printArray(arr, n)
    {
        for (let i = 0; i < n; i++)
            document.write( arr[i] + " ");
               
        document.write();
    }
   
 
// Driver Code
     
        let arr = [ 2, 7, 5, 3, 0, 8, 1 ];
        let n = arr.length;
       
        document.write("Given array is " + "<br />");
        printArray(arr, n);
         
        document.write("<br />");
       
        document.write("Surpasser Count of"
                               + " array is " + "<br />");
        findSurpasser(arr, n);
         
</script>


Output

Given array is 
2 7 5 3 0 8 1 
Surpasser Count of array is 
4 1 1 1 2 0 0 

Time Complexity : O(n2)

Auxiliary Space: O(1) because using constant space for variables

Method 2 (Uses Merge Sort): For any element of the array, we can easily find out number of elements to the right that are greater than that element if we know number of elements to its right that are less than that element. The idea is to count the number of inversions for each element of the array using merge sort. So, surpasser count of an element at position i will be equal to “n – i – inversion-count” at that position where n is the size of the array. 

We have already discussed how to find inversion count of complete array here. We have modified the discussed approach to find number of inversions for each element of the array instead of returning inversion count of whole array. Also, as all elements of the array are distinct, we maintain a map that stores inversion count for each element of the array.

Below is C++ implementation of above idea

C++




// C++ program to find surpasser count of each element
// in array
#include <bits/stdc++.h>
using namespace std;
 
/* Function to merge the two haves arr[l..m] and
   arr[m+1..r] of array arr[] */
int merge(int arr[], int l, int m, int r,
          unordered_map<int, int> &hm)
{
    int i, j, k;
    int n1 = m - l + 1;
    int n2 = r - m;
 
    /* create temp arrays */
    int L[n1], R[n2];
 
    /* Copy data to temp arrays L[] and R[] */
    for (i = 0; i < n1; i++)
        L[i] = arr[l + i];
 
    for (j = 0; j < n2; j++)
        R[j] = arr[m + 1 + j];
 
    /* Merge the temp arrays back into arr[l..r]*/
    i = 0, j = 0, k = l;
    int c = 0;
    while (i < n1 && j < n2)
    {
        if (L[i] <= R[j])
        {
            // increment inversion count of L[i]
            hm[L[i]] += c;
            arr[k++] = L[i++];
        }
        else
        {
            arr[k++] = R[j++];
 
            // inversion found
            c++;
        }
    }
 
    /* Copy the remaining elements of L[], if
    there are any */
    while (i < n1)
    {
        hm[L[i]] += c;
        arr[k++] = L[i++];
    }
 
    /* Copy the remaining elements of R[], if
    there are any */
    while (j < n2)
        arr[k++] = R[j++];
}
 
/* l is for left index and r is right index of
the sub-array of arr to be sorted */
int mergeSort(int arr[], int l, int r,
              unordered_map<int, int> &hm)
{
    if (l < r)
    {
        int m = l + (r - l) / 2;
        mergeSort(arr, l, m, hm);
        mergeSort(arr, m + 1, r, hm);
        merge(arr, l, m, r, hm);
    }
}
 
/* Function to print an array */
void printArray(int arr[], int n)
{
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
}
 
void findSurpasser(int arr[], int n)
{
    // To store inversion count for elements
    unordered_map<int, int> hm;
 
    // To store copy of array
    int dup[n];
    memcpy(dup, arr, n*sizeof(arr[0]));
 
    // Sort the copy and store inversion count
    // for each element.
    mergeSort(dup, 0, n - 1, hm);
 
    printf("Surpasser Count of array is \n");
    for (int i = 0; i < n; i++)
        printf("%d ", (n - 1) - i - hm[arr[i]]);
}
 
/* Driver program to test above functions */
int main()
{
    int arr[] = { 2, 7, 5, 3, 0, 8, 1 };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    printf("Given array is \n");
    printArray(arr, n);
 
    findSurpasser(arr, n);
 
    return 0;
}


Java




// Java program to find surpasser count of each element
// in array
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
 
public class Surpasser {
 
    /* Function to merge the two haves arr[l..m] and
    arr[m+1..r] of array arr[] */
    public static void merge(int[] arr, int l, int m, int r, Map<Integer, Integer> hm) {
        int n1 = m - l + 1;
        int n2 = r - m;
        /* create temp arrays */
        int[] L = new int[n1];
        int[] R = new int[n2];
         
        /* Copy data to temp arrays L[] and R[] */
        for (int i = 0; i < n1; i++) {
            L[i] = arr[l + i];
        }
        for (int j = 0; j < n2; j++) {
            R[j] = arr[m + 1 + j];
        }
         
        /* Merge the temp arrays back into arr[l..r]*/
        int i = 0, j = 0, k = l;
        int c = 0;
        while (i < n1 && j < n2) {
            if (L[i] <= R[j]) {
                // increment inversion count of L[i]
                hm.put(L[i], hm.getOrDefault(L[i], 0) + c);
                arr[k++] = L[i++];
            } else {
                // inversion found
                arr[k++] = R[j++];
                c++;
            }
        }
         
        /* Copy the remaining elements of L[], if
        there are any */
        while (i < n1) {
            hm.put(L[i], hm.getOrDefault(L[i], 0) + c);
            arr[k++] = L[i++];
        }
        /* Copy the remaining elements of R[], if
        there are any */
        while (j < n2) {
            arr[k++] = R[j++];
        }
    }
     
    /* l is for left index and r is right index of
    the sub-array of arr to be sorted */
    public static void mergeSort(int[] arr, int l, int r, Map<Integer, Integer> hm) {
        if (l < r) {
            int m = l + (r - l) / 2;
            mergeSort(arr, l, m, hm);
            mergeSort(arr, m + 1, r, hm);
            merge(arr, l, m, r, hm);
        }
    }
     
    /* Function to print an array */
    public static void findSurpasser(int[] arr,int n)
    {
        // To store inversion count for elements
        Map<Integer, Integer> hm = new HashMap<>();
         
        // To store copy of array
        int[] dup = arr.clone();
         
        // Sort the copy and store inversion count
        // for each element.
        mergeSort(dup, 0, n - 1, hm);
 
        System.out.println("Surpasser Count of array is: ");
        for (int i = 0; i < n; i++) {
            if(hm.containsKey(arr[i]))
            System.out.print((n - 1) - i - hm.get(arr[i]) + " ");
            else
            System.out.print((n - 1) - i + " ");
        }
        System.out.println();
    }
     
    /* Driver program to test above functions */
    public static void main(String[] args) {
        int[] arr = {2, 7, 5, 3, 0, 8, 1};
        int n = arr.length;
 
        System.out.println("Given array is: " + Arrays.toString(arr));
 
        findSurpasser(arr, n);
    }
}
 
// This code is contributed by Aman Kumar


Python3




# Python program to find surpasser count of each element
# in array
 
#  Function to merge the two haves arr[l..m] and
# arr[m+1..r] of array arr[]
def merge(arr, l, m, r, hm):
 
    n1 = m - l + 1
    n2 = r - m
 
    # create temp arrays
    L= [0 for i in range(n1)]
    R = [0 for i in range(n2)]
 
    # Copy data to temp arrays L[] and R[]
    for i in range(n1):
        L[i] = arr[l + i]
 
    for j in range(n2):
        R[j] = arr[m + 1 + j]
 
    #  Merge the temp arrays back into arr[l..r]
    i,j,k,c = 0,0,l,0
    while (i < n1 and j < n2):
        if (L[i] <= R[j]):
            # increment inversion count of L[i]
            if(L[i] in hm):
                hm[L[i]] += c
            else :
                hm[L[i]] = c
            arr[k] = L[i]
            k += 1
            i += 1
        else:
            arr[k] = R[j]
 
            # inversion found
            c += 1
            k += 1
            j += 1
 
    # Copy the remaining elements of L[], if
    # there are any
    while (i < n1):
        if(L[i] in hm):
            hm[L[i]] += c
        else :
            hm[L[i]] = c
        arr[k] = L[i]
        k += 1
        i += 1
 
    # Copy the remaining elements of R[], if
    # there are any
    while (j < n2):
        arr[k] = R[j]
        k += 1
        j += 1
 
# l is for left index and r is right index of
# the sub-array of arr to be sorted
def mergeSort(arr,l,r,hm):
    if (l < r):
        m = l + (r - l) // 2
        mergeSort(arr, l, m, hm)
        mergeSort(arr, m + 1, r, hm)
        merge(arr, l, m, r, hm)
 
#  Function to print an array
def printArray(arr,n):
 
    for i in range(n):
        print(arr[i],end = " ")
    print("")
 
def findSurpasser(arr, n):
    # To store inversion count for elements
    hm = {}
 
    # To store copy of array
    dup = arr[:]
 
    # Sort the copy and store inversion count
    # for each element.
    mergeSort(dup, 0, n - 1, hm)
 
    print("Surpasser Count of array is ")
    for i in range(n):
        print((n - 1) - i - (hm[arr[i]] if arr[i] in hm else 0),end = " ")
 
# Driver program to test above functions
 
arr = [ 2, 7, 5, 3, 0, 8, 1 ]
n = len(arr)
 
print("Given array is ")
printArray(arr, n)
 
findSurpasser(arr, n)
 
# This code is contributed by shinjanpatra


Javascript




<script>
    //Javascript program to find surpasser count of each element
    // in array
     
     
    /* Function to merge the two haves arr[l..m] and
    arr[m+1..r] of array arr[] */
    function merge(arr, l, m, r, hm)
    {
        let i=0, j=0, k=0;
        let n1 = m - l + 1;
        let n2 = r - m;
     
        /* create temp arrays */
        let L=Array(n1);
        let R=Array(n2);
     
        /* Copy data to temp arrays L[] and R[] */
        for (i = 0; i < n1; i++)
            L[i] = arr[l + i];
     
        for (j = 0; j < n2; j++)
            R[j] = arr[m + 1 + j];
     
        /* Merge the temp arrays back into arr[l..r]*/
        i = 0, j = 0, k = l;
        let c = 0;
        while (i < n1 && j < n2)
        {
            if (L[i] <= R[j])
            {
                // increment inversion count of L[i]
                hm[L[i]] += c;
                arr[k++] = L[i++];
            }
            else
            {
                arr[k++] = R[j++];
     
                // inversion found
                c++;
            }
        }
     
        /* Copy the remaining elements of L[], if
        there are any */
        while (i < n1)
        {
            hm[L[i]] += c;
            arr[k++] = L[i++];
        }
     
        /* Copy the remaining elements of R[], if
        there are any */
        while (j < n2)
            arr[k++] = R[j++];
    }
     
    /* l is for left index and r is right index of
    the sub-array of arr to be sorted */
    function mergeSort(arr, l,  r, hm)
    {
        if (l < r)
        {
            let m = l + Math.floor((r - l)/2);
            mergeSort(arr, l, m, hm);
            mergeSort(arr, m + 1, r, hm);
            merge(arr, l, m, r, hm);
        }
    }
     
    /* Function to print an array */
    function printArray(arr, n)
    {
        for (let i = 0; i < n; i++)
            document.write(arr[i]+" ");
        document.write("<br>");
    }
     
    function findSurpasser(arr, n)
    {
        // To store inversion count for elements
        let hm=Array(10000).fill(0);
     
        // To store copy of array
        let dup= Array(n).fill(0);
        for(i=0;i<n;i++)
        dup[i]=arr[i];
     
        // Sort the copy and store inversion count
        // for each element.
        mergeSort(dup, 0, n - 1, hm);
     
        document.write("Surpasser Count of array is <br>");
        for (let i = 0; i < n; i++)
            document.write((n - 1) - i - hm[arr[i]]+" ");
    }
     
    /* Driver program to test above functions */
     
        let arr = [ 2, 7, 5, 3, 0, 8, 1 ];
        let n = arr.length;
     
        document.write("Given array is <br>");
        printArray(arr, n);
     
        findSurpasser(arr, n);
         
    // This code is contributed by Aman Kumar
     
</script>


C#




// C++ program to find surpasser count of each element
// in array
using System;
using System.Collections.Generic;
 
public class Surpasser {
 
    /* Function to merge the two haves arr[l..m] and
    arr[m+1..r] of array arr[] */
    public static void Merge(int[] arr, int l, int m, int r,
                             Dictionary<int, int> hm)
    {
        int n1 = m - l + 1;
        int n2 = r - m;
        /* create temp arrays */
        int[] L = new int[n1];
        int[] R = new int[n2];
 
        /* Copy data to temp arrays L[] and R[] */
        for (int x = 0; x < n1; x++) {
            L[x] = arr[l + x];
        }
        for (int y = 0; y < n2; y++) {
            R[y] = arr[m + 1 + y];
        }
 
        /* Merge the temp arrays back into arr[l..r]*/
        int i = 0, j = 0, k = l;
        int c = 0;
        while (i < n1 && j < n2) {
            if (L[i] <= R[j]) {
                // increment inversion count of L[i]
                if (hm.ContainsKey(L[i])) {
                    hm[L[i]] += c;
                }
                else {
                    hm.Add(L[i], c);
                }
                arr[k++] = L[i++];
            }
            else {
                // inversion found
                arr[k++] = R[j++];
                c++;
            }
        }
 
        /* Copy the remaining elements of L[], if
        there are any */
        while (i < n1) {
            if (hm.ContainsKey(L[i])) {
                hm[L[i]] += c;
            }
            else {
                hm.Add(L[i], c);
            }
            arr[k++] = L[i++];
        }
        /* Copy the remaining elements of R[], if
        there are any */
        while (j < n2) {
            arr[k++] = R[j++];
        }
    }
 
    /* l is for left index and r is right index of
   the sub-array of arr to be sorted */
    public static void MergeSort(int[] arr, int l, int r,
                                 Dictionary<int, int> hm)
    {
        if (l < r) {
            int m = l + (r - l) / 2;
            MergeSort(arr, l, m, hm);
            MergeSort(arr, m + 1, r, hm);
            Merge(arr, l, m, r, hm);
        }
    }
 
    /* Function to print an array */
    public static void FindSurpasser(int[] arr, int n)
    {
        // To store inversion count for elements
        Dictionary<int, int> hm
            = new Dictionary<int, int>();
 
        // To store copy of array
        int[] dup = (int[])arr.Clone();
 
        // Sort the copy and store inversion count
        // for each element.
        MergeSort(dup, 0, n - 1, hm);
 
        Console.Write("Surpasser Count of array is: \n");
        for (int i = 0; i < n; i++) {
            if (hm.ContainsKey(arr[i])) {
                Console.Write((n - 1) - i - hm[arr[i]]
                              + " ");
            }
            else {
                Console.Write((n - 1) - i + " ");
            }
        }
        Console.WriteLine();
    }
 
    /* Driver program to test above functions */
    public static void Main(string[] args)
    {
        int[] arr = { 2, 7, 5, 3, 0, 8, 1 };
        int n = arr.Length;
 
        Console.WriteLine("Given array is: \n"
                          + string.Join(" ", arr));
 
        FindSurpasser(arr, n);
    }
}
// This code is contributed by prajwal kandekar


Output

Given array is 
2 7 5 3 0 8 1 
Surpasser Count of array is 
4 1 1 1 2 0 0 

Time Complexity: O(nlogn)
Auxiliary Space: O(n)



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads