Find a pair of elements swapping which makes sum of two arrays same (original) (raw)

Given two arrays of integers, find a pair of values (one value from each array) that you can swap to give the two arrays the same sum.

**Examples:

**Input: A[] = {4, 1, 2, 1, 1, 2}, B[] = (3, 6, 3, 3)
**Output: 1 3
**Explanation: Sum of elements in A[] = 11 and Sum of elements in B[] = 15. To get same sum from both arrays, we can swap 1 from A[] with 3 from B[].

**Input: A[] = {5, 7, 4, 6}, B[] = {1, 2, 3, 8}
**Output: 6 2
**Explanation: Sum of elements in A[] = 22 and Sum of elements in B[] = 14. To get same sum from both arrays, we can swap 6 from A[] and 2 from B[].

Approaches to find a pair to swap which makes sum of two arrays same:

Table of Content

**[Naive Approach] Check all possible pairs - O(N*M) Time and O(1) Space:

Iterate through the arrays and check all pairs of values. For each element in A[], iterate over all the elements of B[], and check if swapping these two elements will make the sum equal.

Below is the implementation of the above algorithm:

C++ `

// CPP code naive solution to find a pair swapping // which makes sum of arrays sum. #include using namespace std;

// Function to calculate sum of elements of array int getSum(int X[], int n) { int sum = 0; for (int i = 0; i < n; i++) sum += X[i]; return sum; }

void findSwapValues(int A[], int n, int B[], int m) { // Calculation of sums from both arrays int sum1 = getSum(A, n); int sum2 = getSum(B, m);

// Look for val1 and val2, such that 
// sumA - val1 + val2 = sumB - val2 + val1 
int newsum1, newsum2, val1, val2; 
for (int i = 0; i < n; i++) { 
    for (int j = 0; j < m; j++) { 
        newsum1 = sum1 - A[i] + B[j]; 
        newsum2 = sum2 - B[j] + A[i]; 
        if (newsum1 == newsum2) { 
            val1 = A[i]; 
            val2 = B[j]; 
        } 
    } 
} 

cout << val1 << " " << val2; 

}

// Driver code int main() { int A[] = { 4, 1, 2, 1, 1, 2 }; int n = sizeof(A) / sizeof(A[0]); int B[] = { 3, 6, 3, 3 }; int m = sizeof(B) / sizeof(B[0]);

// Call to function 
findSwapValues(A, n, B, m); 
return 0; 

}

Java

// Java program to find a pair swapping // which makes sum of arrays sum import java.io.*;

class GFG { // Function to calculate sum of elements of array static int getSum(int X[], int n) { int sum = 0; for (int i = 0; i < n; i++) sum += X[i]; return sum; }

// Function to prints elements to be swapped
static void findSwapValues(int A[], int n, int B[], int m)
{
    // Calculation of sums from both arrays
    int sum1 = getSum(A, n);
    int sum2 = getSum(B, m);

    // Look for val1 and val2, such that
    // sumA - val1 + val2 = sumB - val2 + val1
    int newsum1, newsum2, val1 = 0, val2 = 0;
    for (int i = 0; i < n; i++) 
    {
        for (int j = 0; j < m; j++) 
        {
            newsum1 = sum1 - A[i] + B[j];
            newsum2 = sum2 - B[j] + A[i];
            if (newsum1 == newsum2) 
            {
                val1 = A[i];
                val2 = B[j];
            }
        }
    }

    System.out.println(val1+" "+val2);
}

// driver program
public static void main (String[] args) 
{
    int A[] = { 4, 1, 2, 1, 1, 2 };
    int n = A.length;
    int B[] = { 3, 6, 3, 3 };
    int m = B.length;

    // Call to function
    findSwapValues(A, n, B, m);
}

}

// Contributed by Pramod Kumar

Python

Python code naive solution to find a pair swapping

which makes sum of lists sum.

Function to calculate sum of elements of list

def getSum(X): sum=0 for i in X: sum+=i return sum

Function to prints elements to be swapped

def findSwapValues(A,B): # Calculation if sums from both lists sum1=getSum(A) sum2=getSum(B)

# Boolean variable used to reduce further iterations
# after the pair is found
k=False

# Lool for val1 and val2, such that
# sumA - val1 + val2 = sumB -val2 + val1
val1,val2=0,0
for i in A:
    for j in B:
        newsum1=sum1-i+j
        newsum2=sum2-j+i
        
        if newsum1 ==newsum2:
            val1=i
            val2=j
            # Set to True when pair is found
            k=True
            break
    # If k is True, it means pair is found.
    # So, no further iterations.
    if k==True:
        break
print (val1,val2)
return

Driver code

A=[4,1,2,1,1,2] B=[3,6,3,3]

Call to function

findSwapValues(A,B)

code contributed by sachin bisht

C#

// C# program to find a pair swapping // which makes sum of arrays sum using System;

class GFG { // Function to calculate sum // of elements of array static int getSum(int[] X, int n) { int sum = 0; for (int i = 0; i < n; i++) sum += X[i]; return sum; }

// Function to prints elements // to be swapped static void findSwapValues(int[] A, int n, int[] B, int m) { // Calculation of sums from // both arrays int sum1 = getSum(A, n); int sum2 = getSum(B, m);

// Look for val1 and val2, such that
// sumA - val1 + val2 = sumB - val2 + val1
int newsum1, newsum2,   
    val1 = 0, val2 = 0;
for (int i = 0; i < n; i++) 
{
    for (int j = 0; j < m; j++) 
    {
        newsum1 = sum1 - A[i] + B[j];
        newsum2 = sum2 - B[j] + A[i];
        if (newsum1 == newsum2) 
        {
            val1 = A[i];
            val2 = B[j];
        }
    }
}

Console.Write(val1 + " " + val2);

}

// Driver Code public static void Main () { int[] A = { 4, 1, 2, 1, 1, 2 }; int n = A.Length; int[] B = { 3, 6, 3, 3 }; int m = B.Length;

// Call to function
findSwapValues(A, n, B, m);

} }

// This code is contributed // by ChitraNayal

Javascript

PHP

i<i < i<n; $i++) sum+=sum += sum+=X[$i]; return $sum; } function findSwapValues($A, n,n, n,B, $m) { // Calculation of sums from both arrays sum1=getSum(sum1 = getSum(sum1=getSum(A, $n); sum2=getSum(sum2 = getSum(sum2=getSum(B, $m); // Look for val1 and val2, such that // sumA - val1 + val2 = sumB - val2 + val1 for ($i = 0; i<i < i<n; $i++) { for ($j = 0; j<j < j<m; $j++) { newsum1=newsum1 = newsum1=sum1 - A[A[A[i] + B[B[B[j]; newsum2=newsum2 = newsum2=sum2 - B[B[B[j] + A[A[A[i]; if ($newsum1 == $newsum2) { val1=val1 = val1=A[$i]; val2=val2 = val2=B[$j]; } } } echo val1."".val1 . " " . val1."".val2; } // Driver code $A = array(4, 1, 2, 1, 1, 2 ); n=sizeof(n = sizeof(n=sizeof(A); $B = array(3, 6, 3, 3 ); m=sizeof(m = sizeof(m=sizeof(B); // Call to function findSwapValues($A, n,n, n,B, $m); // This code is contributed // by Akanksha Rai ?>

`

**Time Complexity :- O(n*m)
**Space Complexity : O(1)

[Better Approach] Sorting both the arrays - O(NlogN + MlogM) Time and O(1) Space:

Suppose the sum of array A[] is sumA and sum of array B[] us sumB, then we need to find a value in A[], say X and a value in B[], say Y, such that:

sumA - X + Y = sumB - Y + X
2X - 2Y = sumA - sumB
X - Y = (sumA - sumB) / 2

To find the elements X and Y, we can sort the array and traverse the array simultaneously using two pointers,

Below is the implementation of the above approach:

C++ `

// CPP code for optimized implementation #include <bits/stdc++.h> using namespace std;

// Returns sum of elements in X[] int getSum(int X[], int n) { int sum = 0; for (int i = 0; i < n; i++) sum += X[i]; return sum; }

// Finds value of // a - b = (sumA - sumB) / 2 int getTarget(int A[], int n, int B[], int m) { // Calculation of sums from both arrays int sum1 = getSum(A, n); int sum2 = getSum(B, m);

// because that the target must be an integer 
if ((sum1 - sum2) % 2 != 0) 
    return 0; 
return ((sum1 - sum2) / 2); 

}

// Prints elements to be swapped void findSwapValues(int A[], int n, int B[], int m) { // Call for sorting the arrays sort(A, A + n); sort(B, B + m);

// Note that target can be negative 
int target = getTarget(A, n, B, m); 

// target 0 means, answer is not possible 
if (target == 0) 
    return; 

int i = 0, j = 0; 
while (i < n && j < m) { 
    int diff = A[i] - B[j]; 
    if (diff == target) { 
        cout << A[i] << " " << B[j]; 
        return; 
    } 

    // Look for a greater value in A[] 
    else if (diff < target) 
        i++; 

    // Look for a greater value in B[] 
    else
        j++; 
} 

}

// Driver code int main() { int A[] = { 4, 1, 2, 1, 1, 2 }; int n = sizeof(A) / sizeof(A[0]);

int B[] = { 1, 6, 3, 3 }; 
int m = sizeof(B) / sizeof(B[0]); 

findSwapValues(A, n, B, m); 
return 0; 

}

Java

// Java code for optimized implementation import java.io.; import java.util.;

class GFG { // Function to calculate sum of elements of array static int getSum(int X[], int n) { int sum = 0; for (int i = 0; i < n; i++) sum += X[i]; return sum; }

// Function to calculate : a - b = (sumA - sumB) / 2
static int getTarget(int A[], int n, int B[], int m)
{
    // Calculation of sums from both arrays
    int sum1 = getSum(A, n);
    int sum2 = getSum(B, m);

    // because that the target must be an integer
    if ((sum1 - sum2) % 2 != 0)
        return 0;
    return ((sum1 - sum2) / 2);
}

// Function to prints elements to be swapped
static void findSwapValues(int A[], int n, int B[], int m)
{
    // Call for sorting the arrays
    Arrays.sort(A);
    Arrays.sort(B);

    // Note that target can be negative
    int target = getTarget(A, n, B, m);

    // target 0 means, answer is not possible
    if (target == 0)
        return;

    int i = 0, j = 0;
    while (i < n && j < m) 
    {
        int diff = A[i] - B[j];
        if (diff == target) 
        {
            System.out.println(A[i]+" "+B[i]);
            return;
        }

        // Look for a greater value in A[]
        else if (diff < target)
            i++;

        // Look for a greater value in B[]
        else
            j++;
    }
}

// driver program
public static void main (String[] args) 
{
    int A[] = { 4, 1, 2, 1, 1, 2 };
    int n = A.length;
    int B[] = { 3, 6, 3, 3 };
    int m = B.length;

    // Call to function
    findSwapValues(A, n, B, m);
}

}

// Contributed by Pramod Kumar

Python

Python code for optimized implementation

#Returns sum of elements in list def getSum(X): sum=0 for i in X: sum+=i return sum

Finds value of

a - b = (sumA - sumB) / 2

def getTarget(A,B): # Calculations of sumd from both lists sum1=getSum(A) sum2=getSum(B)

# Because that target must be an integer
if( (sum1-sum2)%2!=0):
    return 0
return (sum1-sum2)//2

Prints elements to be swapped

def findSwapValues(A,B): # Call for sorting the lists A.sort() B.sort()

#Note that target can be negative
target=getTarget(A,B)

# target 0 means, answer is not possible
if(target==0):
    return
i,j=0,0
while(i<len(A) and j<len(B)):
    diff=A[i]-B[j]
    if diff == target:
        print (A[i],B[j])
        return
    # Look for a greater value in list A
    elif diff <target:
        i+=1
    # Look for a greater value in list B
    else:
        j+=1

A=[4,1,2,1,1,2] B=[3,6,3,3]

findSwapValues(A,B)

#code contributed by sachin bisht

C#

// C# code for optimized implementation using System;

class GFG { // Function to calculate sum of elements of array static int getSum(int []X, int n) { int sum = 0; for (int i = 0; i < n; i++) sum += X[i]; return sum; }

// Function to calculate : a - b = (sumA - sumB) / 2
static int getTarget(int []A, int n, int []B, int m)
{
    // Calculation of sums from both arrays
    int sum1 = getSum(A, n);
    int sum2 = getSum(B, m);

    // because that the target must be an integer
    if ((sum1 - sum2) % 2 != 0)
        return 0;
    return ((sum1 - sum2) / 2);
}

// Function to prints elements to be swapped
static void findSwapValues(int []A, int n, int []B, int m)
{
    // Call for sorting the arrays
    Array.Sort(A);
    Array.Sort(B);

    // Note that target can be negative
    int target = getTarget(A, n, B, m);

    // target 0 means, answer is not possible
    if (target == 0)
        return;

    int i = 0, j = 0;
    while (i < n && j < m) 
    {
        int diff = A[i] - B[j];
        if (diff == target) 
        {
            Console.WriteLine(A[i]+" "+B[i]);
            return;
        }

        // Look for a greater value in A[]
        else if (diff < target)
            i++;

        // Look for a greater value in B[]
        else
            j++;
    }
}

// Driver code
public static void Main (String[] args) 
{
    int []A = { 4, 1, 2, 1, 1, 2 };
    int n = A.Length;
    int []B = { 3, 6, 3, 3 };
    int m = B.Length;

    // Call to function
    findSwapValues(A, n, B, m);
}

}

// This code has been contributed by 29AjayKumar

Javascript

`

**Time Complexity: O(nlog(n) + mlog(m))
**Auxiliary Space: O(1)

**[Expected Approach] Using Hashing - O(N + M) Time and O(N) Space:

As discussed in the previous approach, we need to find an element in A[], say X and an element in B[], say Y such that X - Y = (SumA - SumB)/2, where SumA is the sum of all elements in A[] and SumB is the sum of all elements in B[].

In order to find such a pair, we can use a hash set to store all the values of array A[]. Then, we can iterate on array B[], and for each value in B[] check if ((sumA - sumB)/2 + Y) is present in the hash set or not. If it is present, then print the current element as Y and the element present in the hashset as X.

Below is an implementation of the approach:

C++ `

#include <bits/stdc++.h> using namespace std;

// function to find the values to swap void findSwapValues(int A[], int n, int B[], int m) { // Find the sum of both the arrays int sumA = accumulate(A, A + n, 0); int sumB = accumulate(B, B + m, 0);

// Check if the difference between the sum of both the
// arrays is even or not
if ((sumA - sumB) % 2 != 0) {
    cout << "No Possible Pair exists" << endl;
    return;
}

// Unordered set to store all the elements of A
unordered_set<int> possibleX;
for (int i = 0; i < n; i++) {
    possibleX.insert(A[i]);
}

// Iterate over all the elements of B[] and check if an
// element with the value = X is present in A[] or not
for (int i = 0; i < m; i++) {
    int X = (sumA - sumB) / 2 + B[i];
    if (possibleX.find(X) != possibleX.end()) {
        cout << X << " " << B[i] << endl;
        return;
    }
}

cout << "No Possible Pair exists" << endl;

}

int main() {

// Sample Input
int A[] = { 4, 1, 2, 1, 1, 2 };
int n = sizeof(A) / sizeof(A[0]);

int B[] = { 3, 6, 3, 3 };
int m = sizeof(B) / sizeof(B[0]);

// Function call to print a valid pair
findSwapValues(A, n, B, m);

return 0;

}

Java

import java.util.*;

class GFG { // Function to find the values to swap public static void findSwapValues(int[] A, int n, int[] B, int m) { // Find the sum of both the arrays int sumA = Arrays.stream(A).sum(); int sumB = Arrays.stream(B).sum();

    // Check if the difference between the sum of both
    // the arrays is even or not
    if ((sumA - sumB) % 2 != 0) {
        System.out.println("No Possible Pair exists");
        return;
    }

    // Set to store all the elements of A
    Set<Integer> possibleX = new HashSet<>();
    for (int i = 0; i < n; i++) {
        possibleX.add(A[i]);
    }

    // Iterate over all the elements of B and check if
    // an element with the value = X is present in A or
    // not
    for (int i = 0; i < m; i++) {
        int X = (sumA - sumB) / 2 + B[i];
        if (possibleX.contains(X)) {
            System.out.println(X + " " + B[i]);
            return;
        }
    }

    System.out.println("No Possible Pair exists");
}

public static void main(String[] args)
{
    // Sample Input
    int[] A = { 4, 1, 2, 1, 1, 2 };
    int n = A.length;

    int[] B = { 3, 6, 3, 3 };
    int m = B.length;

    // Function call to print a valid pair
    findSwapValues(A, n, B, m);
}

}

Python

def find_swap_values(A, B): # Find the sum of both the arrays sumA = sum(A) sumB = sum(B)

# Check if the difference between the sum of both the arrays is even or not
if (sumA - sumB) % 2 != 0:
    print("No Possible Pair exists")
    return

# Set to store all the elements of A
possibleX = set(A)

# Iterate over all the elements of B and check if an
# element with the value = X is present in A or not
for Y in B:
    X = (sumA - sumB) // 2 + Y
    if X in possibleX:
        print(X, Y)
        return

print("No Possible Pair exists")

Sample Input

A = [4, 1, 2, 1, 1, 2] B = [3, 6, 3, 3]

Function call to print a valid pair

find_swap_values(A, B)

`

**Time Complexity: O(n + m)
**Auxiliary Space: O(n)