Given an array containing N distinct elements. There are M queries, each containing an integer X and asking for the index of X in the array. For each query, the task is to perform linear search X from left to right and count the number of comparisons it took to find X and do the same thing right to left. In the end, print the total number of comparisons in both directions among all the queries.
Examples:
Input: arr[] = {1, 2}, q[] = {1, 2}
Output: 3, 3
For 1-based indexing
For 1st query : Number of comparisons from left to right is 1 and from right to left is 2
For 2nd query : Number of comparisons from left to right is 2 and from right to left is 1Input: arr[] = {-1, 2, 4, 5, 1}, q[] = {-1, 4, 2}
Output: 3, 7
Approach: Find the index at which X is present in the array say i (1-based indexing), the number of comparisons for left to right would be i and the number of comparisons for right to left would be (n – i + 1). All we need to do is to find the index quickly. It can be done by using a map in which key is the element’s value and value is the index.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Function to return the count of comparisons from left to right // and right to left in linear search among m queries pair< int , int > countCamparisions( int n, int arr[], int m, int qry[]) { int i; unordered_map< int , int > index; for (i = 1; i <= n; i++) { // arr[i] occurs at i index[arr[i]] = i; } // Count of comparisons for left to right and right to left int ltr = 0, rtl = 0; for (i = 1; i <= m; i++) { int x = qry[i]; ltr += index[x]; rtl += n - index[x] + 1; } return make_pair(ltr, rtl); } // Driver Code int main() { // -1 will be ignored as it is 1-based indexing int arr[] = { -1, 2, 4, 5, 1 }; int n = ( sizeof (arr) / sizeof (arr[0])) - 1; int q[] = { -1, 4, 2 }; int m = ( sizeof (q) / sizeof (q[0])) - 1; pair< int , int > res = countCamparisions(n, arr, m, q); cout << res.first << " " << res.second; } |
Java
// Java implementation of the approach import java.util.HashMap; import java.util.Map; class GFG { // Function to return the count of // comparisons from left to right // and right to left in linear // search among m queries static Pair<Integer, Integer> countCamparisions( int n, int arr[], int m, int qry[]) { int i; HashMap<Integer,Integer> index = new HashMap<>(); for (i = 1 ; i <= n; i++) { // arr[i] occurs at i index.put(arr[i], i); } // Count of comparisons for left // to right and right to left int ltr = 0 , rtl = 0 ; for (i = 1 ; i <= m; i++) { int x = qry[i]; ltr += index.get(x); rtl += n - index.get(x) + 1 ; } Pair<Integer, Integer> ans = new Pair<>(ltr, rtl); return ans; } // Driver Code public static void main(String []args) { // -1 will be ignored as it is 1-based indexing int arr[] = { - 1 , 2 , 4 , 5 , 1 }; int n = arr.length - 1 ; int q[] = { - 1 , 4 , 2 }; int m = q.length - 1 ; Pair<Integer, Integer> res = countCamparisions(n, arr, m, q); System.out.println(res.first + " " + res.second); } } class Pair<A, B> { A first; B second; public Pair(A first, B second) { this .first = first; this .second = second; } } // This code is contributed by Rituraj Jain |
Python3
# Python 3 implementation of the # above approach # Function to return the count of # comparisons from left to right # and right to left in linear search # among m queries def countCamparisions(n, arr, m, qry) : index = {} for i in range ( 1 , n + 1 ) : # arr[i] occurs at i index[arr[i]] = i # Count of comparisons for left to # right and right to left ltr, rtl = 0 , 0 for i in range ( 1 , m + 1 ) : x = qry[i] ltr + = index[x] rtl + = n - index[x] + 1 return (ltr, rtl) # Driver Code if __name__ = = "__main__" : # -1 will be ignored as it # is 1-based indexing arr = [ - 1 , 2 , 4 , 5 , 1 ] n = len (arr) - 1 q = [ - 1 , 4 , 2 ] m = len (q) - 1 res = countCamparisions(n, arr, m, q) print (res[ 0 ], res[ 1 ]) # This code is contributed by Ryuga |
C#
// C# implementation of the approach using System; using System.Collections.Generic; class GFG { // Function to return the count of // comparisons from left to right // and right to left in linear // search among m queries static Pair< int , int > countCamparisions( int n, int []arr, int m, int []qry) { int i; Dictionary< int , int > index = new Dictionary< int , int >(); for (i = 1; i <= n; i++) { // arr[i] occurs at i index.Add(arr[i], i); } // Count of comparisons for left // to right and right to left int ltr = 0, rtl = 0; for (i = 1; i <= m; i++) { int x = qry[i]; ltr += index[x]; rtl += n - index[x] + 1; } Pair< int , int > ans = new Pair< int , int >(ltr, rtl); return ans; } // Driver Code public static void Main(String []args) { // -1 will be ignored as // it is 1-based indexing int []arr = { -1, 2, 4, 5, 1 }; int n = arr.Length - 1; int []q = { -1, 4, 2 }; int m = q.Length - 1; Pair< int , int > res = countCamparisions(n, arr, m, q); Console.WriteLine(res.first + " " + res.second); } } class Pair<A, B> { public A first; public B second; public Pair(A first, B second) { this .first = first; this .second = second; } } // This code is contributed by 29AjayKumar |
Javascript
<script> // Javascript implementation of the approach // Function to return the count of comparisons from left to right // and right to left in linear search among m queries function countCamparisions(n, arr, m, qry) { var i; var index = new Map(); for (i = 1; i <= n; i++) { // arr[i] occurs at i index.set(arr[i], i); } // Count of comparisons for left to right and right to left var ltr = 0, rtl = 0; for (i = 1; i <= m; i++) { var x = qry[i]; ltr += index.get(x); rtl += n - index.get(x) + 1; } return [ltr, rtl]; } // Driver Code // -1 will be ignored as it is 1-based indexing var arr = [-1, 2, 4, 5, 1]; var n = arr.length - 1; var q = [-1, 4, 2]; var m = q.length - 1; var res = countCamparisions(n, arr, m, q); document.write( res[0] + " " + res[1]); // This code is contributed by famously. </script> |
3 7
Complexity Analysis:
- Time Complexity: O(N + M)
- Auxiliary Space: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!