Open In App

Minimum swaps to make two arrays consisting unique elements identical

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

Given two arrays that have the same values but in a different order and having no duplicate elements in it, we need to make a second array the same as a first array using the minimum number of swaps. 

Examples:  

Input  : arrA[] = {3, 6, 4, 8}, 
         arrB[] = {4, 6, 8, 3}
Output : 2
Explanation: we can make arrB to same as arrA in 2 swaps which are shown below, swap 4 with 8,
arrB = {8, 6, 4, 3} swap 8 with 3,   arrB = {3, 6, 4, 8}

This problem can be solved by modifying the array B. We save the index of array A elements in array B i.e. if ith element of array A is at jth position in array B, then we will make arrB[i] = j 
For above given example, modified array B will be, arrB = {3, 1, 0, 2}. This modified array represents the distribution of array A element in array B and our goal is to sort this modified array in a minimum number of swaps because after sorting only array B element will be aligned with array A elements. 
Now count of minimum swaps for sorting an array can be found by visualizing the problem as a graph, this problem is already explained in previous article
So we count these swaps in a modified array and that will be our final answer. 

Please see the below code for a better understanding. 

C++




// C++ program to make an array same to another
// using minimum number of swap
#include <bits/stdc++.h>
using namespace std;
  
// Function returns the minimum number of swaps
// required to sort the array
// This method is taken from below post
int minSwapsToSort(int arr[], int n)
{
    // Create an array of pairs where first
    // element is array element and second element
    // is position of first element
    pair<int, int> arrPos[n];
    for (int i = 0; i < n; i++)
    {
        arrPos[i].first = arr[i];
        arrPos[i].second = i;
    }
  
    // Sort the array by array element values to
    // get right position of every element as second
    // element of pair.
    sort(arrPos, arrPos + n);
  
    // To keep track of visited elements. Initialize
    // all elements as not visited or false.
    vector<bool> vis(n, false);
  
    // Initialize result
    int ans = 0;
  
    // Traverse array elements
    for (int i = 0; i < n; i++)
    {
        // already swapped and corrected or
        // already present at correct pos
        if (vis[i] || arrPos[i].second == i)
            continue;
  
        // find out the number of  node in
        // this cycle and add in ans
        int cycle_size = 0;
        int j = i;
        while (!vis[j])
        {
            vis[j] = 1;
  
            // move to next node
            j = arrPos[j].second;
            cycle_size++;
        }
  
        // Update answer by adding current cycle.
        ans += (cycle_size - 1);
    }
  
    // Return result
    return ans;
}
  
// method returns minimum number of swap to make
// array B same as array A
int minSwapToMakeArraySame(int a[], int b[], int n)
{
    // map to store position of elements in array B
    // we basically store element to index mapping.
    map<int, int> mp;
    for (int i = 0; i < n; i++)
        mp[b[i]] = i;
  
    // now we're storing position of array A elements
    // in array B.
    for (int i = 0; i < n; i++)
        b[i] = mp[a[i]];
  
    /* We can uncomment this section to print modified
      b array
    for (int i = 0; i < N; i++)
        cout << b[i] << " ";
    cout << endl; */
  
    // returning minimum swap for sorting in modified
    // array B as final answer
    return minSwapsToSort(b, n);
}
  
//    Driver code to test above methods
int main()
{
    int a[] = {3, 6, 4, 8};
    int b[] = {4, 6, 8, 3};
  
    int n = sizeof(a) / sizeof(int);
    cout << minSwapToMakeArraySame(a, b, n);
    return 0;
}


Java




// Java program to make an array same to another
// using minimum number of swap
import java.io.*;
import java.util.*;
  
// Function returns the minimum number of swaps
// required to sort the array
// This method is taken from below post
class GFG 
{
  
  static int minSwapsToSort(int arr[], int n)
  {
  
    // Create an array of pairs where first
    // element is array element and second element
    // is position of first element    
    ArrayList<ArrayList<Integer>> arrPos = new ArrayList<ArrayList<Integer>>();
    for (int i = 0; i < n; i++)
    {
      arrPos.add(new ArrayList<Integer>(Arrays.asList(arr[i],i)));
    }
  
    // Sort the array by array element values to
    // get right position of every element as second
    // element of pair.
    Collections.sort(arrPos, new Comparator<ArrayList<Integer>>() {    
      @Override
      public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
        return o1.get(0).compareTo(o2.get(0));
      }               
    });
  
    // To keep track of visited elements. Initialize
    // all elements as not visited or false.
    boolean[] vis = new boolean[n];
  
    // Initialize result
    int ans = 0;
  
    // Traverse array elements
    for (int i = 0; i < n; i++)
    {
  
      // already swapped and corrected or
      // already present at correct pos
      if (vis[i] || arrPos.get(i).get(1) == i)
        continue;
  
      // find out the number of  node in
      // this cycle and add in ans
      int cycle_size = 0;
      int j = i;
      while (!vis[j])
      {
        vis[j] = true;
  
        // move to next node
        j = arrPos.get(j).get(1);
        cycle_size++;
      }
  
      // Update answer by adding current cycle.
      ans += (cycle_size - 1);
    }
  
    // Return result
    return ans;
  }
  
  // method returns minimum number of swap to make
  // array B same as array A
  static int minSwapToMakeArraySame(int a[], int b[], int n)
  {
  
    // map to store position of elements in array B
    // we basically store element to index mapping.
    Map<Integer, Integer> mp 
      = new HashMap<Integer, Integer>(); 
  
    for (int i = 0; i < n; i++)
    {
      mp.put(b[i], i);
    }
  
    // now we're storing position of array A elements
    // in array B.
    for (int i = 0; i < n; i++)
      b[i] = mp.get(a[i]);
  
    /* We can uncomment this section to print modified
        b array
        for (int i = 0; i < N; i++)
            cout << b[i] << " ";
        cout << endl; */
  
    // returning minimum swap for sorting in modified
    // array B as final answer
    return minSwapsToSort(b, n);
  }
  
  // Driver code 
  public static void main (String[] args) 
  {
    int a[] = {3, 6, 4, 8};
    int b[] = {4, 6, 8, 3};
    int n = a.length;
  
    System.out.println( minSwapToMakeArraySame(a, b, n));
  }
}
  
// This code is contributed by avanitrachhadiya2155


Python3




# Python3 program to make 
# an array same to another
# using minimum number of swap
  
# Function returns the minimum 
# number of swaps required to 
# sort the array
# This method is taken from below post
# https: // www.geeksforgeeks.org/
# minimum-number-swaps-required-sort-array/
def minSwapsToSort(arr, n):
  
    # Create an array of pairs 
    # where first element is 
    # array element and second
    # element is position of 
    # first element
    arrPos = [[0 for x in range(2)] 
                 for y in range(n)]
      
    for i in range(n):    
        arrPos[i][0] = arr[i]
        arrPos[i][1] = i
  
    # Sort the array by array 
    # element values to get right
    # position of every element 
    # as second element of pair.
    arrPos.sort()
  
    # To keep track of visited 
    # elements. Initialize all 
    # elements as not visited 
    # or false.
    vis = [False] * (n)
  
    # Initialize result
    ans = 0
  
    # Traverse array elements
    for i in range(n):
      
        # Already swapped and corrected or
        # already present at correct pos
        if (vis[i] or arrPos[i][1] == i):
            continue
  
        # Find out the number of  node in
        # this cycle and add in ans
        cycle_size = 0
        j = i
          
        while (not vis[j]):        
            vis[j] = 1
  
            # Move to next node
            j = arrPos[j][1]
            cycle_size+= 1
         
        # Update answer by 
        # adding current cycle.
        ans += (cycle_size - 1)  
  
    # Return result
    return ans
  
# Method returns minimum 
# number of swap to make
# array B same as array A
def minSwapToMakeArraySame(a, b, n):
          
    # map to store position 
    # of elements in array B
    # we basically store 
    # element to index mapping.
    mp = {}
    for i in range(n):
        mp[b[i]] = i
  
    # now we're storing position 
    # of array A elements
    # in array B.
    for i in range(n):
        b[i] = mp[a[i]]
  
    # Returning minimum swap 
    # for sorting in modified
    # array B as final answer
    return minSwapsToSort(b, n)
  
# Driver code 
if __name__ == "__main__":
  
    a = [3, 6, 4, 8]
    b = [4, 6, 8, 3]
    n = len(a)
    print(minSwapToMakeArraySame(a, b, n))
  
# This code is contributed by Chitranayal


C#




// C# program to make an array same to another
// using minimum number of swap
using System;
using System.Collections.Generic;
using System.Linq;
  
// Function returns the minimum number of swaps
// required to sort the array
// This method is taken from below post
public class GFG{
  static int minSwapsToSort(int[] arr, int n)
  {
  
    // Create an array of pairs where first
    // element is array element and second element
    // is position of first element    
    List<List<int>> arrPos = new List<List<int>>();
    for (int i = 0; i < n; i++)
    {
      arrPos.Add(new List<int>(){arr[i],i});
    }
  
    // Sort the array by array element values to
    // get right position of every element as second
    // element of pair.
    arrPos=arrPos.OrderBy(x => x[0]).ToList();
  
    // To keep track of visited elements. Initialize
    // all elements as not visited or false.
    bool[] vis = new bool[n];
    Array.Fill(vis,false);
  
    // Initialize result
    int ans = 0;
  
    // Traverse array elements
    for (int i = 0; i < n; i++)
    {
  
      // already swapped and corrected or
      // already present at correct pos
      if (vis[i] || arrPos[i][1] == i)
        continue;
  
      // find out the number of  node in
      // this cycle and add in ans
      int cycle_size = 0;
      int j = i;
  
      while (!vis[j])
      {
        vis[j] = true;
  
        // move to next node
        j = arrPos[j][1];
        cycle_size++;
      }
  
      // Update answer by adding current cycle.
      ans += (cycle_size - 1);
    }
    // Return result
    return ans;
  }
  
  // method returns minimum number of swap to make
  // array B same as array A
  static int minSwapToMakeArraySame(int[] a, int[] b, int n)
  {
    Dictionary<int,int> mp = new Dictionary<int,int>();
    for (int i = 0; i < n; i++)
    {
      mp.Add(b[i],i);
    }
    // now we're storing position of array A elements
    // in array B.
    for (int i = 0; i < n; i++)
    {
      b[i] = mp[a[i]];
    }
  
    /* We can uncomment this section to print modified
        b array
        for (int i = 0; i < N; i++)
            cout << b[i] << " ";
        cout << endl; */
  
    // returning minimum swap for sorting in modified
    // array B as final answer
    return minSwapsToSort(b, n);
  }
  
  // Driver code 
  static public void Main (){
  
    int[] a = {3, 6, 4, 8};
    int[] b = {4, 6, 8, 3};
    int n = a.Length;
  
    Console.WriteLine( minSwapToMakeArraySame(a, b, n));
  
  }
}
  
// This code is contributed by rag2127


Javascript




<script>
  
// JavaScript program to make an array same to another
// using minimum number of swap
  
// Function returns the minimum number of swaps
// required to sort the array
// This method is taken from below post
/*
-required-sort-array/
*/
function minSwapsToSort(arr,n)
{
    // Create an array of pairs where first
    // element is array element and second element
    // is position of first element   
    let arrPos = [];
    for (let i = 0; i < n; i++)
    {
      arrPos.push([arr[i],i]);
    }
   
    // Sort the array by array element values to
    // get right position of every element as second
    // element of pair.
    arrPos.sort(function(a,b){return a[0]-b[0];});
   
    // To keep track of visited elements. Initialize
    // all elements as not visited or false.
    let vis = new Array(n);
    for(let i=0;i<n;i++)
    {
        vis[i]=false;
    }
   
    // Initialize result
    let ans = 0;
   
    // Traverse array elements
    for (let i = 0; i < n; i++)
    {
   
      // already swapped and corrected or
      // already present at correct pos
      if (vis[i] || arrPos[i][1] == i)
        continue;
   
      // find out the number of  node in
      // this cycle and add in ans
      let cycle_size = 0;
      let j = i;
      while (!vis[j])
      {
        vis[j] = true;
   
        // move to next node
        j = arrPos[j][1];
        cycle_size++;
      }
   
      // Update answer by adding current cycle.
      ans += (cycle_size - 1);
    }
   
    // Return result
    return ans;
}
  
// method returns minimum number of swap to make
  // array B same as array A
function minSwapToMakeArraySame(a,b,n)
{
    // map to store position of elements in array B
    // we basically store element to index mapping.
    let mp = new Map();
   
    for (let i = 0; i < n; i++)
    {
      mp.set(b[i], i);
    }
   
    // now we're storing position of array A elements
    // in array B.
    for (let i = 0; i < n; i++)
      b[i] = mp.get(a[i]);
   
    /* We can uncomment this section to print modified
        b array
        for (int i = 0; i < N; i++)
            cout << b[i] << " ";
        cout << endl; */
   
    // returning minimum swap for sorting in modified
    // array B as final answer
    return minSwapsToSort(b, n);
}
  
// Driver code
let a=[3, 6, 4, 8];
let b=[4, 6, 8, 3];
let n = a.length;
document.write( minSwapToMakeArraySame(a, b, n));
  
// This code is contributed by ab2127
  
</script>


Output:  

2

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



Last Updated : 19 Sep, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads