Dada una array arr[] de N enteros, la tarea es reemplazar cada elemento de la array con su rango en la array .
El rango de un elemento se define como la distancia entre el elemento y el primer elemento de la array cuando la array se organiza en orden ascendente. Si dos o más son iguales en la array, su rango también es el mismo que el rango de la primera aparición del elemento.
Por ejemplo: Sea la array dada arr[] = {2, 2, 1, 6}, luego el rango de los elementos viene dado por: la
array ordenada es:
arr[] = {1, 2, 2, 6}
Rank(1) = 1 (en el índice 0)
Rango (2) = 2 (en el índice 1)
Rango (2) = 2 (en el índice 2)
Rango (6) = 4 (en el índice 3)
Ejemplos:
Entrada: arr[] = [100, 5, 70, 2]
Salida: [4, 2, 3, 1]
Explicación:
El rango de 2 es 1, 5 es 2, 70 es 3 y 100 es 4.
Entrada: arr[ ] = [100, 2, 70, 2]
Salida: [3, 1, 2, 1]
Explicación:
el rango de 2 es 1, 70 es 2 y 100 es 3.
Enfoque ingenuo: el enfoque ingenuo consiste en encontrar que el rango de cada elemento es 1 + el recuento de elementos más pequeños en la array para el elemento actual.
Complejidad de tiempo: O(N 2 )
Espacio auxiliar: O(1)
Enfoque eficiente: Para optimizar el enfoque ingenuo anterior, busque rangos de elementos y luego asigne el rango a los elementos. A continuación se muestran los pasos:
- Para calcular el rango del elemento, primero haga una copia de arr[] dado y luego ordene esa array copiada en orden ascendente.
- Luego recorra la array copiada y coloque su rango en HashMap tomando una variable de rango.
- Si el elemento ya está presente en HashMap, no actualice el rango; de lo contrario, actualice el rango del elemento en HashMap e incremente también la variable de rango.
- Atraviese la array dada arr[] asigne el rango de cada elemento usando el rango almacenado en HashMap.
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; // Function to assign rank to // array elements void changeArr(int input[], int N) { // Copy input array into newArray int newArray[N]; copy(input, input + N, newArray); // Sort newArray[] in ascending order sort(newArray, newArray + N); int i; // Map to store the rank of // the array element map<int, int> ranks; int rank = 1; for(int index = 0; index < N; index++) { int element = newArray[index]; // Update rank of element if (ranks[element] == 0) { ranks[element] = rank; rank++; } } // Assign ranks to elements for(int index = 0; index < N; index++) { int element = input[index]; input[index] = ranks[input[index]]; } } // Driver code int main() { // Given array arr[] int arr[] = { 100, 2, 70, 2 }; int N = sizeof(arr) / sizeof(arr[0]); // Function call changeArr(arr, N); // Print the array elements cout << "["; for(int i = 0; i < N - 1; i++) { cout << arr[i] << ", "; } cout << arr[N - 1] << "]"; return 0; } // This code is contributed by divyeshrabadiya07
Java
// Java program for the above approach import java.util.*; class GFG { // Function to assign rank to // array elements static void changeArr(int[] input) { // Copy input array into newArray int newArray[] = Arrays .copyOfRange(input, 0, input.length); // Sort newArray[] in ascending order Arrays.sort(newArray); int i; // Map to store the rank of // the array element Map<Integer, Integer> ranks = new HashMap<>(); int rank = 1; for (int index = 0; index < newArray.length; index++) { int element = newArray[index]; // Update rank of element if (ranks.get(element) == null) { ranks.put(element, rank); rank++; } } // Assign ranks to elements for (int index = 0; index < input.length; index++) { int element = input[index]; input[index] = ranks.get(input[index]); } } // Driver Code public static void main(String[] args) { // Given array arr[] int[] arr = { 100, 2, 70, 2 }; // Function Call changeArr(arr); // Print the array elements System .out .println(Arrays .toString(arr)); } }
Python3
# Python3 program for the above approach # Function to assign rank to # array elements def changeArr(input1): # Copy input array into newArray newArray = input1.copy() # Sort newArray[] in ascending order newArray.sort() # Dictionary to store the rank of # the array element ranks = {} rank = 1 for index in range(len(newArray)): element = newArray[index]; # Update rank of element if element not in ranks: ranks[element] = rank rank += 1 # Assign ranks to elements for index in range(len(input1)): element = input1[index] input1[index] = ranks[input1[index]] # Driver Code if __name__ == "__main__": # Given array arr[] arr = [ 100, 2, 70, 2 ] # Function call changeArr(arr) # Print the array elements print(arr) # This code is contributed by chitranayal
C#
// C# program for the above approach using System; using System.Collections.Generic; using System.Text; class GFG{ // Function to assign rank to // array elements static void changeArr(int[] input) { // Copy input array into newArray int []newArray = new int[input.Length]; Array.Copy(input, newArray, input.Length); // Sort newArray[] in ascending order Array.Sort(newArray); // To store the rank of // the array element Dictionary<int, int> ranks= new Dictionary<int, int>(); int rank = 1; for(int index = 0; index < newArray.Length; index++) { int element = newArray[index]; // Update rank of element if (!ranks.ContainsKey(element)) { ranks[element] = rank; rank++; } } // Assign ranks to elements for(int index = 0; index < input.Length; index++) { input[index] = ranks[input[index]]; } } // Driver Code public static void Main(string[] args) { // Given array arr[] int[] arr = { 100, 2, 70, 2 }; // Function call changeArr(arr); // Print the array elements Console.WriteLine("[{0}]", string.Join(", ", arr)); } } // This code is contributed by rutvik_56
Javascript
<script> // Javascript program for the above approach // Function to assign rank to // array elements function changeArr(input, N) { // Copy input array into newArray var newArray = JSON.parse(JSON.stringify(input)); // Sort newArray[] in ascending order newArray.sort((a,b)=> a-b); var i; // Map to store the rank of // the array element var ranks = new Map(); var rank = 1; for(var index = 0; index < N; index++) { var element = newArray[index]; // Update rank of element if (!ranks.has(element)) { ranks.set(element, rank); rank++; } } // Assign ranks to elements for(var index = 0; index < N; index++) { var element = input[index]; input[index] = ranks.get(input[index]); } return input; } // Driver code // Given array arr[] var arr = [100, 2, 70, 2]; var N = arr.length; // Function call arr = changeArr(arr, N); // Print the array elements document.write( "["); for(var i = 0; i < N - 1; i++) { document.write( arr[i] + ", "); } document.write( arr[N - 1] + "]"); // This code is contributed by famously. </script>
[3, 1, 2, 1]
Complejidad de tiempo: O(N * log N)
Espacio auxiliar: O(N)