I am counting the element from array, which is greater then the given element (k)
// Java implementation of the approach class GFG { // Function to return the count of elements // from the array which are greater than k static int countGreater(int arr[], int n, int k) //arr-array, n-array length, k-number { //here first I sorted array int l = 0; int r = n - 1; // Stores the index of the left most element // from the array which is greater than k int leftGreater = n; // Finds number of elements greater than k while (l <= r) { int m = l + (r - l) / 2; // If mid element is greater than // k update leftGreater and r if (arr[m] > k) { leftGreater = m; r = m - 1; } // If mid element is less than // or equal to k update l else l = m + 1; } // Return the count of elements greater than k return (n - leftGreater); }
I solved with comparing only one number, but what if I have an array to compare with
Advertisement
Answer
A simple O(nk)
solution would be to go through arr
for each number in arr2
and count the number of values that are greater.
static int[] countGreater(Integer arr[], int n, Integer arr2[], int k) { int[] res = new int[arr2.length]; for(int i=0; i<k; i++) { int count = 0; for(int v : arr) if(v > arr2[i]) count++; res[i] = count; } return res; }
However, we can do better than this by extending the method you’ve already identified – sorting arr
and using binary search to identify the position of each value in arr2
. If arr2
is also sorted then we can use the previously identified position as the initial left-hand edge of our binary search, since we know that subsequent elements in arr2
have to be greater than the current value.
Here’s some Java code to illustrate:
static int[] countGreater(Integer arr[], int n, Integer arr2[], int k) { Collections.sort(Arrays.asList(arr)); // assume arr2 is sorted, otherwise results could be out of order int[] res = new int[arr2.length]; for(int i=0, pos=0; i<k; i++) { pos = 1 + Arrays.binarySearch(arr, pos, n, arr2[i]); if(pos < 0) pos = -pos; res[i] = n - pos; } return res; }
I’ve simplified the code quite a bit by making use of the Arrays.binarySearch
method.
For small values of n
and k
the simple approach will probably be faster, but as they grow the binarySearch approach will take over, despite the cost of the initial sort.