Count of equal value pairs from given two Arrays such that a[i] equals b[j] - GeeksforGeeks

13 Dec, 2021
Given two arrays a[] and b[] of length N and M respectively, sorted in non-decreasing order. The task is to find the number of pairs (i, j) such that, a[i] equals b[j].
Examples:
Input: a[] = {1, 1, 3, 3, 3, 5, 8, 8}, b[] = {1, 3, 3, 4, 5, 5, 5}Output: 11Explanation: Following are the 11 pairs with given condition The 11 pairs are {{1, 1}, {1, 1}, {3, 3}, {3, 3}, {3, 3}, {3, 3}, {3, 3}, {3, 3}, {5, 5}, {5, 5}, {5, 5}} . 
Input: a[] = {1, 2, 3, 4}, b[] = {1, 1, 2}Output: 3
Approach: This problem can be solved by using the Two Pointer approach. Let i point to the first element of array a[] and j point to the first element of array b[]. While traversing the arrays, there will be 3 cases.
Case 1: a[i] = b[j] Let target denote arr[i], cnt1 denote number of elements of array a that are equal to target and cnt2 denote the number of elements of array b that are equal to target. So the total number of pairs such that a[i] = b[j] is cnt1 * cnt2 . So our answer is incremented by cnt1 * cnt2 .Case 2: a[i] < b[j] The only possibility of getting a[i] = b[j] in the future is by incrementing i, so we do i++.Case 3: a[i] > b[j] The only possibility of getting a[i] = b[j] in the future is by incrementing j, so we do j++ .
Follow the steps below to solve the given problem.
Initialize the variables ans, i and j as 0.
Initialize answer, i, and j to 0 and start traversing both of the arrays till i is less than N or j is less than M.If a[i] equals b[j], calculate cnt1 and cnt2 and increment the answer by cnt1 * cnt2.If a[i] is less than b[j], increment i.If a[i] is greater than b[j], increment j.
If a[i] equals b[j], calculate cnt1 and cnt2 and increment the answer by cnt1 * cnt2.
If a[i] is less than b[j], increment i.
If a[i] is greater than b[j], increment j.
After performing the above steps, print the values of ans as the answer.
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// C++ Program for above approach#include <bits/stdc++.h>using namespace std; // Function to find number of pairs with// satisfying the given conditionint findPairs(int* a, int* b, int n, int m){     // Initialize ans, i, j to 0 .    int ans = 0, i = 0, j = 0;     // Use the two pointer approach to    // calculate the answer .    while (i < n && j < m) {         // Case - 1        if (a[i] == b[j]) {             // Target denotes a[i]            // or b[j] as a[i] = b[j].             // cnt1 denotes the number            // of elements in array            // a that are equal to target.             // cnt2 denotes the number            // of elements in array            // b that are equal to target            int target = a[i], cnt1 = 0, cnt2 = 0;             // Calculate cnt1            while (i < n && a[i] == target) {                cnt1++;                i++;            }             // Calculate cnt2            while (j < m && b[j] == target) {                cnt2++;                j++;            }             // Increment the answer by (cnt1 * cnt2)            ans += (cnt1 * cnt2);        }         // Case - 2        else if (a[i] < b[j])            i++;         // Case - 3        else            j++;    }     // Return the answer    return ans;} // Driver Codeint main(){    int N = 8, M = 7;    int a[] = { 1, 1, 3, 3, 3, 5, 8, 8 };    int b[] = { 1, 3, 3, 4, 5, 5, 5 };     cout << findPairs(a, b, N, M);}
// Java program for above approachimport java.io.*; class GFG{ // Function to find number of pairs with// satisfying the given conditionstatic int findPairs(int[] a, int[] b, int n, int m){         // Initialize ans, i, j to 0 .    int ans = 0, i = 0, j = 0;     // Use the two pointer approach to    // calculate the answer .    while (i < n && j < m)    {                 // Case - 1        if (a[i] == b[j])        {                         // Target denotes a[i]            // or b[j] as a[i] = b[j].             // cnt1 denotes the number            // of elements in array            // a that are equal to target.             // cnt2 denotes the number            // of elements in array            // b that are equal to target            int target = a[i], cnt1 = 0, cnt2 = 0;             // Calculate cnt1            while (i < n && a[i] == target)            {                cnt1++;                i++;            }                         // Calculate cnt2            while (j < m && b[j] == target)            {                cnt2++;                j++;            }             // Increment the answer by (cnt1 * cnt2)            ans += (cnt1 * cnt2);        }         // Case - 2        else if (a[i] < b[j])            i++;         // Case - 3        else            j++;    }     // Return the answer    return ans;} // Driver Codepublic static void main(String[] args){    int N = 8, M = 7;    int a[] = { 1, 1, 3, 3, 3, 5, 8, 8 };    int b[] = { 1, 3, 3, 4, 5, 5, 5 };     System.out.println(findPairs(a, b, N, M));}} // This code is contributed by Potta Lokesh
# Python3 program for above approach # Function to find number of pairs with# satisfying the given conditiondef findPairs(a, b, n, m):         # Initialize ans, i, j to 0 .    ans = 0    i = 0    j = 0     # Use the two pointer approach to    # calculate the answer .    while (i < n and j < m):         # Case - 1        if (a[i] == b[j]):             # Target denotes a[i]            # or b[j] as a[i] = b[j].             # cnt1 denotes the number            # of elements in array            # a that are equal to target.             # cnt2 denotes the number            # of elements in array            # b that are equal to target            target = a[i]            cnt1 = 0            cnt2 = 0             # Calculate cnt1            while (i < n and a[i] == target):                cnt1 += 1                i += 1             # Calculate cnt2            while (j < m and b[j] == target):                cnt2 += 1                j += 1             # Increment the answer by (cnt1 * cnt2)            ans += (cnt1 * cnt2)         # Case - 2        elif (a[i] < b[j]):            i += 1         # Case- 3        else:            j += 1     # Return the answer    return ans # Driver Codeif __name__ == "__main__":     N = 8    M = 7    a = [ 1, 1, 3, 3, 3, 5, 8, 8 ]    b = [ 1, 3, 3, 4, 5, 5, 5 ]     print(findPairs(a, b, N, M)) # This code is contributed by ukasp
// C# program for above approachusing System; class GFG{ // Function to find number of pairs with// satisfying the given conditionstatic int findPairs(int[] a, int[] b, int n, int m){         // Initialize ans, i, j to 0 .    int ans = 0, i = 0, j = 0;     // Use the two pointer approach to    // calculate the answer .    while (i < n && j < m)    {                 // Case - 1        if (a[i] == b[j])        {                         // Target denotes a[i]            // or b[j] as a[i] = b[j].             // cnt1 denotes the number            // of elements in array            // a that are equal to target.             // cnt2 denotes the number            // of elements in array            // b that are equal to target            int target = a[i], cnt1 = 0, cnt2 = 0;             // Calculate cnt1            while (i < n && a[i] == target)            {                cnt1++;                i++;            }                         // Calculate cnt2            while (j < m && b[j] == target)            {                cnt2++;                j++;            }             // Increment the answer by (cnt1 * cnt2)            ans += (cnt1 * cnt2);        }         // Case - 2        else if (a[i] < b[j])            i++;         // Case - 3        else            j++;    }     // Return the answer    return ans;} // Driver Codepublic static void Main(){    int N = 8, M = 7;    int []a = { 1, 1, 3, 3, 3, 5, 8, 8 };    int []b = { 1, 3, 3, 4, 5, 5, 5 };     Console.Write(findPairs(a, b, N, M));}} // This code is contributed by Samim Hossain Mondal.
<script>// Javascript Program for above approach // Function to find number of pairs with// satisfying the given conditionfunction findPairs(a, b, n, m){     // Initialize ans, i, j to 0 .    let ans = 0, i = 0, j = 0;     // Use the two pointer approach to    // calculate the answer .    while (i < n && j < m) {         // Case - 1        if (a[i] == b[j]) {             // Target denotes a[i]            // or b[j] as a[i] = b[j].             // cnt1 denotes the number            // of elements in array            // a that are equal to target.             // cnt2 denotes the number            // of elements in array            // b that are equal to target            let target = a[i], cnt1 = 0, cnt2 = 0;             // Calculate cnt1            while (i < n && a[i] == target) {                cnt1++;                i++;            }             // Calculate cnt2            while (j < m && b[j] == target) {                cnt2++;                j++;            }             // Increment the answer by (cnt1 * cnt2)            ans += (cnt1 * cnt2);        }         // Case - 2        else if (a[i] < b[j])            i++;         // Case - 3        else            j++;    }     // Return the answer    return ans;} // Driver Codelet N = 8, M = 7;let a = [ 1, 1, 3, 3, 3, 5, 8, 8 ];let b = [ 1, 3, 3, 4, 5, 5, 5 ]; document.write(findPairs(a, b, N, M)); // This code is contributed by saurabh_jaiswal.</script>
11
Time Complexity: O(N + M)Auxiliary Space: O(1)
lokeshpotta20
samim2000
ukasp
_saurabh_jaiswal
two-pointer-algorithm
Arrays
Combinatorial
Mathematical
Sorting
two-pointer-algorithm
Arrays
Mathematical
Sorting
Combinatorial
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Count pairs with given sum
Chocolate Distribution Problem
Window Sliding Technique
Reversal algorithm for array rotation
Next Greater Element
Write a program to print all permutations of a given string
Permutation and Combination in Python
itertools.combinations() module in Python to print all possible combinations
Combinational Sum
Factorial of a large number