Minimum changes required to make two arrays identical - GeeksforGeeks

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++
Java
Python3
C#
PHP
Javascript
// C++ program to find minimum changes// required to make two arrays identical#include <bits/stdc++.h>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[0]);    cout << minChange(n, a, b);    return 0;}
// 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 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 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# required 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 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 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# 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[100010];static int []sz=new int[100010]; // 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// PHP 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 = array_fill(0, $N, NULL);$sz = array_fill(0, $N, NULL); // Function to assign rootfunction Root($idx){    global $id;    $i = $idx;    while ($i != $id[$i])    {        $id[$i] = $id[$id[$i]];        $i = $id[$i];    }     return $i;} // Function to find Unionfunction Union($a, $b){    global $sz, $id;    $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.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?>
<script>// Javascript program to find minimum changes// required to make two arrays identical         let  N=100010;    /* 'id': stores parent of a node.    'sz': stores size of a DSU tree. */    let id=new Array(100010);    let sz=new Array(100010);         // Function to assign root    function Root(idx)    {        let i = idx;        while (i != id[i])        {            id[i] = id[id[i]];            i = id[i];        }           return i;    }         // Function to find Union    function Union(a,b)    {        let i = Root(a);        let 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.    function minChange(n,a,b)    {        // Sets as single elements        for (let i = 0; i < N; i++)        {            id[i] = i;            sz[i] = 1;        }       // Combine items if they belong to different    // sets.        for (let 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.        let ans = 0;        for (let i = 0; i < n; ++i)            if (id[i] == i)                ans += (sz[i] - 1);           return ans;    }         // Driver program    let a=[2, 1, 1, 3, 5 ];    let b=[ 1, 2, 2, 4, 5 ];    let n = a.length;    document.write(minChange(n, a, b));  // This code is contributed by rag2127</script>
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. 
Mithun Kumar
vt_m
mohit kumar 29
ukasp
rag2127
akshaysingh98088
sweetyty
union-find
Advanced Data Structure
Arrays
Competitive Programming
Arrays
union-find
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Agents in Artificial Intelligence
Decision Tree Introduction with example
Disjoint Set Data Structures
AVL Tree | Set 2 (Deletion)
Red-Black Tree | Set 2 (Insert)
Arrays in Java
Arrays in C/C++
Program for array rotation
Stack Data Structure (Introduction and Program)
Top 50 Array Coding Problems for Interviews