Given two unsorted arrays, find all pairs whose sum is x

2

Given two unsorted arrays of distinct elements, the task is to find all pairs from both arrays whose sum is equal to x.

Examples:

Input :  arr1[] = {-1, -2, 4, -6, 5, 7}
         arr2[] = {6, 3, 4, 0}  
         x = 8
Output : 4 4
         5 3

Input : arr1[] = {1, 2, 4, 5, 7} 
        arr2[] = {5, 6, 3, 4, 8}  
        x = 9
Output : 1 8
         4 5
         5 4

Asked in : Amazon

A Naive approach is to simply run two loops and pick elements from both arrays. One by one check that both elements sum is equal to given value x or not.

// C++ program to find all pairs in both arrays
// whose sum is equal to given value x
#include<bits/stdc++.h>
using namespace std;

// Function to print all pairs in both arrays
// whose sum is equal to given value x
void findPairs(int arr1[], int arr2[], int n,
                               int m, int x)
{
    for (int i=0; i<n; i++)
        for (int j=0; j<m; j++)
            if (arr1[i] + arr2[j] == x)
                cout << arr1[i] << " "
                     << arr2[j] << endl;
}

// Driver code
int main()
{
    int arr1[] = {1, 2, 3, 7, 5, 4};
    int arr2[] = {0, 7, 4, 3, 2, 1};
    int n = sizeof(arr1)/sizeof(int);
    int m = sizeof(arr2)/sizeof(int);
    int x = 8;
    findPairs(arr1, arr2, n, m, x);
    return 0;
}

Output:

1 7
7 1
5 3
4 4

Time Complexity : O(n^2)
Auxiliary Space : O(1)

An Efficient solution of this problem is to hashing. Hash table is implemented using unordered_set in C++. We store all first array elements in hash table. For elements of second array, we subtract every element from x and check the result in hash table. If result is present, we print the element and key in hash (which is an element of first array).

C++

// C++ program to find all pair in both arrays
// whose sum is equal to given value x
#include<bits/stdc++.h>
using namespace std;

// Function to find all pairs in both arrays
// whose sum is equal to given value x
void findPairs(int arr1[], int arr2[], int n,
                               int m, int x)
{
    // Insert all elements of first array in a hash
    unordered_set<int> s;
    for (int i=0; i<n; i++)
        s.insert(arr1[i]);

    // Subtract sum from second array elements one
    // by one and check it's present in array first
    // or not
    for (int j=0; j<m; j++)
        if (s.find(x - arr2[j]) != s.end())
            cout << x-arr2[j] << " "
                 << arr2[j] << endl;
}

// Driver code
int main()
{
    int arr1[] = {1, 0, -4, 7, 6, 4};
    int arr2[] = {0 ,2, 4, -3, 2, 1};
    int x = 8;
    int n = sizeof(arr1)/sizeof(int);
    int m = sizeof(arr2)/sizeof(int);
    findPairs(arr1, arr2, n, m, x);
    return 0;
}

Java

// JAVA Code for Given two unsorted arrays, 
// find all pairs whose sum is x
import java.util.*;

class GFG {

     // Function to find all pairs in both arrays
    // whose sum is equal to given value x
    public static void findPairs(int arr1[], int arr2[],
                                 int n, int m, int x)
    {
        // Insert all elements of first array in a hash
        HashMap<Integer, Integer> s = new HashMap<Integer, Integer>();
        
        for (int i = 0; i < n; i ++)
            s.put(arr1[i], 0);
     
        // Subtract sum from second array elements one
        // by one and check it's present in array first
        // or not
        for (int j = 0; j < m; j ++)
            if (s.containsKey(x - arr2[j]))
                System.out.println(x - arr2[j] + " " + arr2[j]);             
    }
    
    /* Driver program to test above function */
    public static void main(String[] args) 
    {
        int arr1[] = {1, 0, -4, 7, 6, 4};
        int arr2[] = {0 ,2, 4, -3, 2, 1};
        int x = 8;
        
        findPairs(arr1, arr2, arr1.length, arr2.length, x);
     
    }
  }
// This code is contributed by Arnav Kr. Mandal.


Output:

6 2
4 4
6 2
7 1

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

This article is contributed by DANISH_RAZA . 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.

GATE CS Corner    Company Wise Coding Practice

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.

Recommended Posts:



2 Average Difficulty : 2/5.0
Based on 37 vote(s)










Writing code in comment? Please use ide.geeksforgeeks.org, generate link and share the link here.