Find two non-overlapping pairs having equal sum in an Array

Given an unsorted array of integers. The task is to find any two non-overlapping pairs whose sum is equal.

Two pairs are said to be non-overlapping if all the elements of the pairs are at different indices. That is, pair (Ai, Aj) and pair (Am, An) are said to be non-overlapping if i ≠ j ≠ m ≠ n.

Examples:

Input: arr[] = {8, 4, 7, 8, 4}
Output: Pair First(4, 8)
        Pair Second (8, 4)

Input: arr[] = {8, 4, 7, 4}
Output: No such non-overlapping pairs present.
Note: (8, 4) and (8, 4) forms overlapping pair
as index of 8 is same in both pairs.

The idea is to use a map of key-value pair to store all occurrences of a sum. The key in the map will store the sum and the corresponding value will be a list of pair of indices (i, j) with that sum.

  • The idea is to traverse the array and generate all possible pairs.
  • If a new sum is found, insert it directly to the map otherwise check if any of the previously encountered pairs with that sum does not overlap with current pair.
  • If not, print both of the pairs.

Below is implementation of the above appproach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP programs to find two non-overlapping
// pairs having equal sum in an Array
  
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
  
typedef pair<int, int> Pair;
  
// Function to find two non-overlapping
// with same sum in an array
void findPairs(int arr[], int n)
{
    // first create an empty map
    // key -> which is sum of a pair of
    // elements in the array
    // value -> vector storing index of
    // every pair having that sum
    unordered_map<int, vector<Pair> > map;
  
    // consider every pair (arr[i], arr[j])
    // and where (j > i)
    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
  
            // calculate sum of current pair
            int sum = arr[i] + arr[j];
  
            // if sum is already present in the map
            if (map.find(sum) != map.end()) {
  
                // check every pair having equal sum
                for (auto pair : map.find(sum)->second) {
                    int m = pair.first, n = pair.second;
  
                    // if pairs don't overlap,
                    // print them and return
                    if ((m != i && m != j) && (n != i && n != j)) {
                        cout << "Pair First(" << arr[i] << ", "
                             << arr[j] << ")\nPair Second ("
                             << arr[m] << ", " << arr[n] << ")";
                        return;
                    }
                }
            }
  
            // Insert current pair into the map
            map[sum].push_back({ i, j });
        }
    }
  
    // If no such pair found
    cout << "No such non-overlapping pairs present";
}
  
// Driver Code
int main()
{
    int arr[] = { 8, 4, 7, 8, 4 };
    int size = sizeof(arr) / sizeof(arr[0]);
  
    findPairs(arr, size);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find two non-overlapping
// pairs having equal sum in an Array
  
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
  
// Declare a pair
class Pair {
    public int x, y;
  
    Pair(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}
  
class GFG {
    // Function to find two non-overlapping
    // pairs with same sum in an array
    public static void findPairs(int[] A)
    {
        // first create an empty map
        // key -> which is sum of a pair
        // of elements in the array
        // value -> list storing index of
        // every pair having that sum
        Map<Integer, List<Pair> > map = new HashMap<>();
  
        // consider every pair (A[i], A[j]) where (j > i)
        for (int i = 0; i < A.length - 1; i++) {
            for (int j = i + 1; j < A.length; j++) {
  
                // calculate sum of current pair
                int sum = A[i] + A[j];
  
                // if sum is already present in the map
                if (map.containsKey(sum)) {
  
                    // check every pair having desired sum
                    for (Pair pair : map.get(sum)) {
                        int x = pair.x;
                        int y = pair.y;
  
                        // if pairs don't overlap, print
                        // them and return
                        if ((x != i && x != j) && (y != i && y != j)) {
                            System.out.println("Pair First(" + A[i] + ", "
                                               + A[j] + ")");
  
                            System.out.println("Pair Second (" + A[x] + ", "
                                               + A[y] + ")");
  
                            return;
                        }
                    }
                }
  
                // Insert current pair into the map
                map.putIfAbsent(sum, new ArrayList<>());
                map.get(sum).add(new Pair(i, j));
            }
        }
  
        System.out.print("No such non-overlapping pairs present");
    }
  
    // Driver Code
    public static void main(String[] args)
    {
        int[] A = { 8, 4, 7, 8, 4 };
  
        findPairs(A);
    }
}

chevron_right


Python3

# Python3 programs to find two non-overlapping
# pairs having equal Sum in an Array

# Function to find two non-overlapping
# with same Sum in an array
def findPairs(arr, size):

# first create an empty Map
# key -> which is Sum of a pair of
# elements in the array
# value -> vector storing index of
# every pair having that Sum
Map = {}

# consider every pair (arr[i], arr[j])
# and where (j > i)
for i in range(0, size – 1):
for j in range(i + 1, size):

# calculate Sum of current pair
Sum = arr[i] + arr[j]

# if Sum is already present in the Map
if Sum in Map:

# check every pair having equal Sum
for pair in Map[Sum]:
m, n = pair

# if pairs don’t overlap,
# print them and return
if ((m != i and m != j) and
(n != i and n != j)):

print(“Pair First ({}, {})”.
format(arr[i], arr[j]))
print(“Pair Second ({}, {})”.
format(arr[m], arr[n]))
return

# Insert current pair into the Map
if Sum not in Map:
Map[Sum] = []
Map[Sum].append((i, j))

# If no such pair found
print(“No such non-overlapping pairs present”)

# Driver Code
if __name__ == “__main__”:

arr = [8, 4, 7, 8, 4]
size = len(arr)

findPairs(arr, size)

# This code is contributed by Rituraj Jain

Output:

Pair First(4, 8)
Pair Second (8, 4)


My Personal Notes arrow_drop_up

Strategy Path planning and Destination matters in success No need to worry about in between temporary failures

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 : rituraj_jain