Related Articles
Minimum changes required to make two arrays identical
• Difficulty Level : Medium
• Last Updated : 25 Jan, 2019

Given two arrays and with n elements each. The task is to make these two arrays identical i:e, for each , we want to make . In a single operation, you can choose two integers x and y, and replace all the occurrences of x in both the arrays with y. Notice that regardless of the number of occurrences replaced, it will still be counted as a single operation. You have to output minimum number of operation required.

Examples:

Input : 1 2 2
1 2 5
Output: 1
Here, (x, y) = (5, 2) hence ans = 1.

Input : 2 1 1 3 5
1 2 2 4 5
Output: 2
Here, (x, y) = (1, 2) and (3, 4) thus ans = 2.
Other pairs are also possible.


## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

This problem can be solved with the help of Disjoint Set Union.
We will check all elements of both the arrays i:e for each . If the elements belong to same id then we skip it. Else, we do a Union operation on both elements. At last the answer will be the sum of the sizes of all the different disjoint sets formed i:e . We subtract 1 because initially we take size of each set to be 1.
Below is the implementation of above approach :

## C++

 // C++ program to find minimum changes // required to make two arrays identical#include using namespace std;  #define N 100010  /*  'id': stores parent of a node.    'sz': stores size of a DSU tree. */int id[N], sz[N];  // Function to assign rootint Root(int idx){    int i = idx;    while (i != id[i])        id[i] = id[id[i]], i = id[i];      return i;}  // Function to find Unionvoid Union(int a, int b){    int i = Root(a), j = Root(b);      if (i != j) {        if (sz[i] >= sz[j]) {            id[j] = i, sz[i] += sz[j];            sz[j] = 0;        }        else {            id[i] = j, sz[j] += sz[i];            sz[i] = 0;        }    }}  // function to find minimum changes required// to make both array equal.int minChange(int n, int a[], int b[]){      // Sets as single elements    for (int i = 0; i < N; i++)        id[i] = i, sz[i] = 1;      // Combine items if they belong to different    // sets.    for (int i = 0; i < n; ++i)          // true if both elements have different root        if (Root(a[i]) != Root(b[i]))            Union(a[i], b[i]); // make root equal      // Find sum sizes of all sets formed.    int ans = 0;    for (int i = 0; i < n; ++i)        if (id[i] == i)            ans += (sz[i] - 1);      return ans;}  // Driver programint main(){      int a[] = { 2, 1, 1, 3, 5 }, b[] = { 1, 2, 2, 4, 5 };    int n = sizeof(a) / sizeof(a);    cout << minChange(n, a, b);    return 0;}

## Java

 // Java program to find minimum changes // required to make two arrays identical  class GFG{static int N=100010;  /* 'id': stores parent of a node.    'sz': stores size of a DSU tree. */static int[] id=new int;static int[] sz=new int;  // Function to assign rootstatic int Root(int idx){    int i = idx;    while (i != id[i])        {            id[i] = id[id[i]];            i = id[i];        }      return i;}  // Function to find Unionstatic void Union(int a, int b){    int i = Root(a);    int j = Root(b);      if (i != j) {        if (sz[i] >= sz[j]) {            id[j] = i;            sz[i] += sz[j];            sz[j] = 0;        }        else {            id[i] = j;            sz[j] += sz[i];            sz[i] = 0;        }    }}  // function to find minimum changes required// to make both array equal.static int minChange(int n, int a[], int b[]){      // Sets as single elements    for (int i = 0; i < N; i++)        {            id[i] = i;            sz[i] = 1;        }      // Combine items if they belong to different    // sets.    for (int i = 0; i < n; ++i)          // true if both elements have different root        if (Root(a[i]) != Root(b[i]))            Union(a[i], b[i]); // make root equal      // Find sum sizes of all sets formed.    int ans = 0;    for (int i = 0; i < n; ++i)        if (id[i] == i)            ans += (sz[i] - 1);      return ans;}  // Driver programpublic static void main(String[] args){      int a[] = { 2, 1, 1, 3, 5 }, b[] = { 1, 2, 2, 4, 5 };    int n = a.length;    System.out.println(minChange(n, a, b));}}// This code is contributed by mits

## Python 3

 # Python 3 program to find minimum changes# required to make two arrays identical  N = 100010  # 'id':stores parent of a node# 'sz':stores size of a DSU treeID = [0 for i in range(N)]sz = [0 for i in range(N)]  # function to assign rootdef Root(idx):    i = idx    while i != ID[i]:        ID[i], i = ID[ID[i]], ID[i]    return i  # Function to find Uniondef Union(a, b):    i, j = Root(a), Root(b)          if i != j:        if sz[i] >= sz[j]:            ID[j] = i            sz[i] += sz[j]            sz[j] = 0        else:            ID[i] = j            sz[j] += sz[i]            sz[i] = 0  # function to find minimum changes# reqired to make both array equaldef minChange(n, a, b):          # sets as single elements    for i in range(N):        ID[i] = i        sz[i] = 1              # Combine items if they belong     # to differnet sets    for i in range(n):                  # true if both elements have        # different root        if Root(a[i]) != Root(b[i]):            Union(a[i], b[i])          # find sum sizes of all sets formed    ans = 0    for i in range(n):        if ID[i] == i:            ans += (sz[i] - 1)          return ans      # Driver Codea = [2, 1, 1, 3, 5]b = [1, 2, 2, 4, 5]n = len(a)  print(minChange(n, a, b))  # This code is contributed # by Mohit kumar 29 (IIIT gwalior)

## C#

 // C# program to find minimum changes // required to make two arrays identicalusing System;  class GFG{static int N=100010;  /* 'id': stores parent of a node.    'sz': stores size of a DSU tree. */static int []id=new int;static int []sz=new int;  // Function to assign rootstatic int Root(int idx){    int i = idx;    while (i != id[i])        {            id[i] = id[id[i]];            i = id[i];        }      return i;}  // Function to find Unionstatic void Union(int a, int b){    int i = Root(a);    int j = Root(b);      if (i != j) {        if (sz[i] >= sz[j]) {            id[j] = i;            sz[i] += sz[j];            sz[j] = 0;        }        else {            id[i] = j;            sz[j] += sz[i];            sz[i] = 0;        }    }}  // function to find minimum changes required// to make both array equal.static int minChange(int n, int []a, int []b){      // Sets as single elements    for (int i = 0; i < N; i++)        {            id[i] = i;            sz[i] = 1;        }      // Combine items if they belong to different    // sets.    for (int i = 0; i < n; ++i)          // true if both elements have different root        if (Root(a[i]) != Root(b[i]))            Union(a[i], b[i]); // make root equal      // Find sum sizes of all sets formed.    int ans = 0;    for (int i = 0; i < n; ++i)        if (id[i] == i)            ans += (sz[i] - 1);      return ans;}  // Driver programpublic static void Main(){      int []a = { 2, 1, 1, 3, 5 };    int []b = { 1, 2, 2, 4, 5 };    int n = a.Length;    Console.WriteLine(minChange(n, a, b));}}// This code is contributed by anuj_67..

## PHP

 = $sz[$j])         {            $id[$j] = $i; $sz[$i] += $sz[$j]; $sz[$j] = 0; } else  { $id[$i] = $j;            $sz[$j] += $sz[$i];            $sz[$i] = 0;        }    }}  // function to find minimum changes // required to make both array equal.function minChange($n, &$a, &$b){ global $id, $sz, $N;      // Sets as single elements    for ($i = 0; $i < $N; $i++)    {        $id[$i] = $i; $sz[$i] = 1; }   // Combine items if they belong to  // different sets. for ($i = 0; $i < $n; ++$i)   // true if both elements have  // different roots if (Root($a[$i]) != Root($b[$i])) Union($a[$i], $b[$i]); // make root equal   // Find sum sizes of all sets formed. $ans = 0;    for ($i = 0; $i < $n; ++$i)        if ($id[$i] == $i) $ans += ($sz[$i] - 1);      return $ans;}  // Driver Code$a = array(2, 1, 1, 3, 5);$b = array(1, 2, 2, 4, 5);$n = sizeof($a);echo minChange($n, $a, $b);  // This code is contributed by ita_c?>
Output:
2


Time Complexity: O(N + n) where N is maximum possible value of an array item and n is number of elements in the array.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up