Dada una array arr[] que tiene N elementos positivos distintos, la tarea es generar otra array B[] tal que, para cada i -ésimo índice en la array, arr[] , B[i] es el número positivo mínimo que falta en arr [] excluyendo arr[i] .
Ejemplos:
Entrada: arr[] = {2, 1, 5, 3}
Salida: B[] = {2, 1, 4, 3}
Explicación: después de excluir arr[0], la array es {1, 5, 3} , y el número positivo mínimo que no está presente en esta array es 2. Por lo tanto, B[0] = 2. De manera similar, después de excluir arr[1], arr[2], arr[3], los números positivos mínimos que son no presentes en la array son 1, 4 y 3, respectivamente. Por lo tanto, B[1] = 1, B[2] = 4, B[3] = 3.Entrada: arr[] = {1, 9, 2, 4}
Salida: B[] = {1, 3, 2, 3}
Enfoque ingenuo: el enfoque más simple para resolver este problema es atravesar la array arr[] y para cada índice i , inicializar una array hash[] y para cada índice j (donde j ≠ i ), actualizar hash[arr[j]] =1 . Ahora recorra la array hash[] desde el índice 1 y encuentre el índice mínimo k para el cual hash[k] = 0 y actualice B[i] = k . Finalmente, imprima la array B[] después de completar el paso anterior.
Complejidad de tiempo: O(N 2 ) donde N es la longitud de la array dada.
Espacio Auxiliar: O(N)
Enfoque eficiente: para optimizar el enfoque anterior, la idea es calcular MEX de la array arr[] y atravesar la array arr[] . Si arr[i] es menor que MEX del arreglo arr[] entonces MEX excluyendo este elemento será arr[i] mismo, y si arr[i] es mayor que MEX del arreglo A[] entonces MEX del arreglo no será cambiar después de excluir este elemento.
Siga los pasos a continuación para resolver el problema:
- Inicialice una array, digamos hash[] , para almacenar si el valor i está presente en la array arr[] o no. Si i está presente hash[i] = 1 de lo contrario hash[i] = 0.
- Inicialice una variable MexOfArr para almacenar MEX de la array arr[] y recorra la array hash[] desde 1 para encontrar el índice mínimo j para el cual hash[j] = 0, lo que implica que el valor j no está presente en la array arr[] y almacene MexOfArr = j .
- Ahora recorra la array, arr[] y si arr[i] es menor que MexOfArr, entonces almacene B[i] = arr[i] else B[i] = MexOfArr .
- Después de completar los pasos anteriores, imprima los elementos de la array B[] como la respuesta requerida.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; #define MAXN 100001 // Function to construct array B[] that // stores MEX of array A[] excluding A[i] void constructMEX(int arr[], int N) { // Stores elements present in arr[] int hash[MAXN] = { 0 }; // Mark all values 1, if present for (int i = 0; i < N; i++) { hash[arr[i]] = 1; } // Initialize variable to store MEX int MexOfArr; // Find MEX of arr[] for (int i = 1; i < MAXN; i++) { if (hash[i] == 0) { MexOfArr = i; break; } } // Stores MEX for all indices int B[N]; // Traverse the given array for (int i = 0; i < N; i++) { // Update MEX if (arr[i] < MexOfArr) B[i] = arr[i]; // MEX default else B[i] = MexOfArr; } // Print the array B for (int i = 0; i < N; i++) cout << B[i] << ' '; } // Driver Code int main() { // Given array int arr[] = { 2, 1, 5, 3 }; // Given size int N = sizeof(arr) / sizeof(arr[0]); // Function call constructMEX(arr, N); return 0; }
Java
// Java program for the above approach import java.util.*; class GFG{ static int MAXN = 100001; // Function to construct array // B[] that stores MEX of array // A[] excluding A[i] static void constructMEX(int arr[], int N) { // Stores elements present // in arr[] int hash[] = new int[MAXN]; for (int i = 0; i < N; i++) { hash[i] = 0; } // Mark all values 1, if // present for (int i = 0; i < N; i++) { hash[arr[i]] = 1; } // Initialize variable to // store MEX int MexOfArr = 0 ; // Find MEX of arr[] for (int i = 1; i < MAXN; i++) { if (hash[i] == 0) { MexOfArr = i; break; } } // Stores MEX for all // indices int B[] = new int[N]; // Traverse the given array for (int i = 0; i < N; i++) { // Update MEX if (arr[i] < MexOfArr) B[i] = arr[i]; // MEX default else B[i] = MexOfArr; } // Print the array B for (int i = 0; i < N; i++) System.out.print(B[i] + " "); } // Driver Code public static void main(String[] args) { // Given array arr[] int arr[] = {2, 1, 5, 3}; // Size of array int N = arr.length; // Function call constructMEX(arr, N); } } // This code is contributed by sanjoy_62
Python3
# Python3 program for the # above approach MAXN = 100001 # Function to construct # array B[] that stores # MEX of array A[] excluding # A[i] def constructMEX(arr, N): # Stores elements present # in arr[] hash = [0] * MAXN # Mark all values 1, # if present for i in range(N): hash[arr[i]] = 1 # Initialize variable to # store MEX MexOfArr = 0 # Find MEX of arr[] for i in range(1, MAXN): if (hash[i] == 0): MexOfArr = i break # Stores MEX for all # indices B = [0] * N # Traverse the given array for i in range(N): # Update MEX if (arr[i] < MexOfArr): B[i] = arr[i] # MEX default else: B[i] = MexOfArr # Print array B for i in range(N): print(B[i], end = " ") # Driver Code if __name__ == '__main__': # Given array arr = [2, 1, 5, 3] # Given size N = len(arr) # Function call constructMEX(arr, N) # This code is contributed by Mohit Kumar 29
C#
// C# program for the above approach using System; class GFG{ static int MAXN = 100001; // Function to construct array // B[] that stores MEX of array // A[] excluding A[i] static void constructMEX(int[] arr, int N) { // Stores elements present // in arr[] int[] hash = new int[MAXN]; for(int i = 0; i < N; i++) { hash[i] = 0; } // Mark all values 1, if // present for(int i = 0; i < N; i++) { hash[arr[i]] = 1; } // Initialize variable to // store MEX int MexOfArr = 0; // Find MEX of arr[] for(int i = 1; i < MAXN; i++) { if (hash[i] == 0) { MexOfArr = i; break; } } // Stores MEX for all // indices int[] B = new int[N]; // Traverse the given array for(int i = 0; i < N; i++) { // Update MEX if (arr[i] < MexOfArr) B[i] = arr[i]; // MEX default else B[i] = MexOfArr; } // Print the array B for(int i = 0; i < N; i++) Console.Write(B[i] + " "); } // Driver Code public static void Main() { // Given array arr[] int[] arr = { 2, 1, 5, 3 }; // Size of array int N = arr.Length; // Function call constructMEX(arr, N); } } // This code is contributed by code_hunt
Javascript
<script> // Javascript program for the above approach var MAXN = 100001; // Function to construct array B[] that // stores MEX of array A[] excluding A[i] function constructMEX(arr, N) { // Stores elements present in arr[] var hash = Array(MAXN).fill(0); // Mark all values 1, if present for (var i = 0; i < N; i++) { hash[arr[i]] = 1; } // Initialize variable to store MEX var MexOfArr; // Find MEX of arr[] for (var i = 1; i < MAXN; i++) { if (hash[i] == 0) { MexOfArr = i; break; } } // Stores MEX for all indices var B = Array(N); // Traverse the given array for (var i = 0; i < N; i++) { // Update MEX if (arr[i] < MexOfArr) B[i] = arr[i]; // MEX default else B[i] = MexOfArr; } // Print the array B for (var i = 0; i < N; i++) document.write( B[i] + ' '); } // Driver Code // Given array var arr = [2, 1, 5, 3]; // Given size var N = arr.length; // Function call constructMEX(arr, N); </script>
2 1 4 3
Complejidad temporal: O(N)
Espacio auxiliar: O(N)