Print all the pairs that contains the positive and negative values of an element

Given an array of distinct integers, print all the pairs having a positive value and negative value of a number that exists in the array.
Note: Order of the pairs doesn’t matter.

Examples:

Input: arr[] = { 1, -3, 2, 3, 6, -1 }
Output: -1 1 -3 3

Input: arr[] = { 4, 8, 9, -4, 1, -1, -8, -9 }
Output: -1 1 -4 4 -8 8 -9 9

A naive approach is to run two loops i.e. Consider each element of the array using the outer loop and search for its corresponding positive/negative value in the array using an inner loop. Similarly, find all the pairs. Time Complexity of this approach will be O( n2).

A better approach is to use sorting i.e. first sort the array and then for each negative element, do a binary search to find its counterpart (+ve number). If found, print that pair. If the current element is positive then break that loop as after that there will be all the positive numbers.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find pairs of positive
// and negative values present in an array.
#include <bits/stdc++.h>
using namespace std;
  
void printPairs(int arr[], int n)
{
    bool pair_exists = false;
    // Sort the array
    sort(arr, arr + n);
  
    // Traverse the array
    for (int i = 0; i < n; i++) {
  
        // For every arr[i] < 0 element,
        // do a binary search for arr[i] > 0.
        if (arr[i] < 0) {
  
            // If found, print the pair.
            if (binary_search(arr, arr + n, -arr[i])) {
                cout << arr[i] << ", " << -arr[i] << endl;
  
                pair_exists = true;
            }
        }
  
        else
            break;
    }
  
    if (pair_exists == false)
        cout << "No such pair exists";
}
  
// Driver code
int main()
{
    int arr[] = { 4, 8, 9, -4, 1, -1, -8, -9 };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    printPairs(arr, n);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find pairs 
// of positive and negative 
// values present in an array.
import java.util.*;
class GFG
{
static void printPairs(int arr[], int n)
{
    boolean pair_exists = false;
      
    // Sort the array
    Arrays.sort(arr);
  
    // Traverse the array
    for (int i = 0; i < n; i++) 
    {
  
        // For every arr[i] < 0 element,
        // do a binary search for arr[i] > 0.
        if (arr[i] < 0
        {
  
            // If found, print the pair.
            if (java.util.Arrays.binarySearch(arr, -arr[i])!=-1
            {
                System.out.println(arr[i] + ", " + -arr[i] );
  
                pair_exists = true;
            }
        }
  
        else
            break;
    }
  
    if (pair_exists == false)
        System.out.println("No such pair exists");
}
  
// Driver code
public static void main(String args[])
{
    int arr[] = { 4, 8, 9, -4, 1, -1, -8, -9 };
    int n =arr.length;
  
    printPairs(arr, n);
}
}
  
// This code is contributed
// by Arnab Kundu

chevron_right


Python 3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find pairs of positive 
# and negative values present in an array. 
  
# function for binary search
def binary_search(a, x, lo=0, hi=None):
    if hi is None:
        hi = len(a)
    while lo < hi:
        mid = (lo+hi)//2
        midval = a[mid]
        if midval < x:
            lo = mid+1
        elif midval > x: 
            hi = mid
        else:
            return mid
    return -1
  
def printPairs(arr, n): 
  
    pair_exists = False
    # Sort the array 
    arr.sort() 
  
    # Traverse the array 
    for i in range(n):
      
  
        # For every arr[i] < 0 element, 
        # do a binary search for arr[i] > 0. 
        if (arr[i] < 0): 
  
            # If found, print the pair. 
            if (binary_search(arr,-arr[i])): 
                print(arr[i] , ", " , -arr[i]) 
  
                pair_exists = True
          
          
  
        else:
            break
      
  
    if (pair_exists == False): 
        print("No such pair exists"
  
  
# Driver code 
if __name__=='__main__':
    arr = [ 4, 8, 9, -4, 1, -1, -8, -9
    n = len(arr) 
  
    printPairs(arr, n) 
      
# this code is contributed by ash264

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find pairs 
// of positive and negative 
// values present in an array. 
  
using System;
public class GFG{
  
static void printPairs(int []arr, int n) 
    bool pair_exists = false
      
    // Sort the array 
    Array.Sort(arr); 
  
    // Traverse the array 
    for (int i = 0; i < n; i++) 
    
  
        // For every arr[i] < 0 element, 
        // do a binary search for arr[i] > 0. 
        if (arr[i] < 0) 
        
  
            // If found, print the pair. 
            if (Array.BinarySearch(arr, -arr[i])!=-1) 
            
                Console.WriteLine(arr[i] + ", " + -arr[i] ); 
  
                pair_exists = true
            
        
  
        else
            break
    
  
    if (pair_exists == false
        Console.WriteLine("No such pair exists"); 
  
// Driver code 
public static void Main() 
    int []arr = { 4, 8, 9, -4, 1, -1, -8, -9 }; 
    int n =arr.Length; 
  
    printPairs(arr, n); 
  
  
// This code is contributed by 29AjayKumar

chevron_right


Output:



-9, 9
-8, 8
-4, 4
-1, 1

Time Complexity: O(nlogn)

An efficient Approach is to use hashing. Below are the required steps:

  • Start traversing the array.
  • Store all the psoitve values in an unordered_set.
  • Check for each negative element, if their corresponding positive element exists in the set or not.
  • If yes, print the pair
  • Also, maintain a flag to check if no such pair exists.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find pairs of positive
// and negative values present in an array
#include <bits/stdc++.h>
using namespace std;
  
// Function to print pairs of positive
// and negative values present in the array
void printPairs(int arr[], int n)
{
    unordered_set<int> pairs;
    bool pair_exists = false;
  
    // Store all the positive elements
    // in the unordered_set
    for (int i = 0; i < n; i++)
        if (arr[i] > 0)
            pairs.insert(arr[i]);
  
    // Start traversing the array
    for (int i = 0; i < n; i++) {
  
        // Check if the positive value of current
        // element exists in the set or not
        if (arr[i] < 0)
            if (pairs.find(-arr[i]) != pairs.end())
  
            { // Print that pair
                cout << arr[i] << ", " << -arr[i] << endl;
  
                pair_exists = true;
            }
    }
  
    if (pair_exists == false)
        cout << "No such pair exists";
}
  
// Driver code
int main()
{
    int arr[] = { 4, 8, 9, -4, 1, -1, -8, -9 };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    printPairs(arr, n);
    return 0;
}

chevron_right


Output:

-4, 4
-1, 1
-8, 8
-9, 9

Time Complexity: O(n)



My Personal Notes arrow_drop_up

A Coding Enthusiast Rails Developer

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 Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : andrew1234, ash264, 29AjayKumar