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]
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)
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. ?> |
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)
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; } |
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 of above solution is O(nlogn).
This article is contributed by Aditya Goel. 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 write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
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.
Recommended Posts:
- Form an array of distinct elements with each element as sum of an element from each array
- Find Array formed by adding each element of given array with largest element in new array to its left
- Sum of product of each element with each element after it
- Find just strictly greater element from first array for each element in second array
- Array formed from difference of each element from the largest element in the given array
- For each element in 1st array count elements less than or equal to it in 2nd array
- For each element in 1st array count elements less than or equal to it in 2nd array | Set 2
- Count of elements in first Array greater than second Array with each element considered only once
- Count distinct elements after adding each element of First Array with Second Array
- Range Query on array whose each element is XOR of index value and previous element
- Replace each element by the difference of the total size of the array and frequency of that element
- Find the difference of count of equal elements on the right and the left for each element
- Find the count of subsequences where each element is divisible by K
- Cumulative frequency of count of each element in an unsorted array
- Count the number of pop operations on stack to get each element of the array
- Count of smaller elements on right side of each element in an Array using Merge sort
- Count of greater elements for each element in the Array
- Count of right shifts for each array element to be in its sorted position
- Count of pairs having each element equal to index of the other from an Array
- Count of permutations of an Array having each element as a multiple or a factor of its index
Improved By : vt_m

