# Minimum changes required to make two arrays identical

• Difficulty Level : Medium
• Last Updated : 25 Aug, 2021

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 the minimum number of operations 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.

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 the same id then we skip it. Otherwise, we do a Union operation on both elements. Finally, 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 the size of each set to be 1.

Below is the implementation of the 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 root int Root(int idx) {     int i = idx;     while (i != id[i])         id[i] = id[id[i]], i = id[i];       return i; }   // Function to find Union void 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 program int main() {       int a[] = { 2, 1, 1, 3, 5 }, b[] = { 1, 2, 2, 4, 5 };     int n = sizeof(a) / sizeof(a[0]);     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[100010]; static int[] sz=new int[100010];   // Function to assign root static int Root(int idx) {     int i = idx;     while (i != id[i])         {             id[i] = id[id[i]];             i = id[i];         }       return i; }   // Function to find Union static 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 program public 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

## Python3

 # 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 tree ID = [0 for i in range(N)] sz = [0 for i in range(N)]   # function to assign root def Root(idx):     i = idx     while i != ID[i]:         ID[i], i = ID[ID[i]], ID[i]     return i   # Function to find Union def 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 # required to make both array equal def 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 different 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 Code a = [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 identical using 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[100010]; static int []sz=new int[100010];   // Function to assign root static int Root(int idx) {     int i = idx;     while (i != id[i])         {             id[i] = id[id[i]];             i = id[i];         }       return i; }   // Function to find Union static 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 program public 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 ?>

## Javascript

 

Output:

2

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

My Personal Notes arrow_drop_up
Recommended Articles
Page :