Algoritmos notables: Eliminar duplicados en array ordenado
Otro algoritmo que utiliza estructuras de datos 🫡 échale un ojito y hazte pro.

Otro algoritmo interesante, éste no es muy difícil pero sí va a requerir de tu ingenio, así que comencemos! 😉

Enunciado

Dado un array de números enteros ordenados ascendentemente, remover los elementos duplicados mientras que el orden de los elementos debe permanecer. finalmente debes retornar el número de elementos únicos.

Una particularidad que tiene este ejercicio es que deberás modificar directamente el arreglo inicial, de forma que deberás remover los elementos duplicados in-place, esto quiere decir que este algoritmo opera directamente con la estructura de datos del input.

Una vez que los elementos únicos estén escritos en el arreglo no es necesario hacer nada con los demás elementos, pudiendo dejarlos tal cual.

Puedes utilizar cualuquier estructura de datos sin embargo no deberás utilizar el método Distinct de Linq para hallar elementos únicos.

Por ejemplo:

Si el arreglo inicial se llama initialArray aquí te presento dos casos de uso:

initialArray: [1,1,2]

initialArray final: [1,2,X] donde X puede ser cualquier valor

Retorno: 2 ya que hay 2 elementos únicos

initialArray: [1,1,1,2,2,3]

initialArray final: [1,2,3,X,X,X]

Retorno: 3 ya que hay 3 elementos únicos

Inténtalo tú primero, no saltes directo a la solución crack! 🤔👀

Algoritmo

Para resolver este ejercicio hacer lo siguiente:

  • Iterar por cada elemento del arreglo inicial.
  • Insertar el elemento en un HashSet (estructura de datos que siempre almacena valores únicos)
  • Mediante un contador detectar si ha cambiado la cantidad de elementos del HashSet
  • Si ha habido aumento, entonces sobre-escribir un elemento en el arreglo inicial. Llevar la cuenta de los índices con otro contador.
  • Retornar cantidad de elementos del HashSet.

Como notarás aquí usamos HashSet, y con esto queda demostrado que aprender estructuras de datos es muy importante. En esta entrada te hablo de las estructuras de datos en .NET 😉

Código

    public int RemoveDuplicates(int[] initialArray) {
        var hash = new HashSet<int>();        
        int lastCounter = 0;
        int internalCounter = 0;
        foreach(var item in initialArray){
            hash.Add(item);            
            if(hash.Count > lastCounter){
                initialArray[internalCounter] = item;
                internalCounter++;
                lastCounter = hash.Count;
            }
        }
        return hash.Count;
    }

Recuerda que esta entrada es de la serie de artículos Algoritmos notables, los cuales los subo a este repo, puedes visitarlo y descubrir más algoritmos 😉

Así como en el tenis, la práctica te hace de élite, en el código la práctica te hara un pro. Foto de Gonzalo Facello en Unsplash

Si te ha fascinado esta entrada compártela pues crack 🫡

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *