Dadas dos arrays, y con n elementos cada una. La tarea es hacer que estas dos arrays sean idénticas, es decir, para cada una , queremos hacer . En una sola operación, puede elegir dos números enteros x e y , y reemplazar todas las apariciones de x en ambas arrays con y . Tenga en cuenta que, independientemente del número de ocurrencias reemplazadas, aún se contará como una sola operación. Debe generar el número mínimo de operaciones requeridas.
Ejemplos:
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.
Este problema se puede resolver con la ayuda de Disjoint Set Union .
Verificaremos todos los elementos de ambas arrays i:e para cada uno . Si los elementos pertenecen al mismo id , lo omitimos. De lo contrario, hacemos una operación de unión en ambos elementos. Finalmente, la respuesta será la suma de los tamaños de todos los diferentes conjuntos disjuntos formados i:e . Restamos 1 porque, inicialmente, tomamos el tamaño de cada conjunto como 1.
A continuación se muestra la implementación del enfoque anterior:
C++
// 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 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
<?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 root function Root($idx) { global $id; $i = $idx; while ($i != $id[$i]) { $id[$i] = $id[$id[$i]]; $i = $id[$i]; } return $i; } // Function to find Union function 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 ?>
Javascript
<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
Complejidad de tiempo: O(N + n) donde N es el valor máximo posible de un elemento de array y n es el número de elementos en la array.
Publicación traducida automáticamente
Artículo escrito por Sanjit_Prasad y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA