Charlie L ⚡️ Profile picture
Apr 3, 2021 49 tweets 14 min read Read on X
Hora de un ⚡️#thread! Vamos a trabajar un poco más los ejercicios que preguntan en la entrevista enfocada a algoritmos en que preguntan en #FAANG

Este es mi favorito -> Number of islands.

Es un ejercicio de nivel medio.

leetcode.com/problems/numbe…
En este ejercicio vamos a ver un algoritmos llamado DFS. Voy a tratar de explicarlo lo más sencillo posible. Pero lee este thread tantas veces lo necesites, y pregúntame las dudas que tengas.

Lo importante es que DFS te haga click 🧑🏽‍💻
El ejercicio Number of Islands dice:
Tenemos un array de m * n, lleno de valores “1” y “0”.

1 representa tierra, y 0 el mar.

Una isla esta representada por varios 1 contiguos.

Cuántas islas hay en los arrays que nos den? Image
Pongámosle un poco de color a lo que estamos buscando.

En el ejemplo, están iluminados los grupos de 1s contiguos que representan islas.

En este caso, tenemos 3 islas! Image
Antes de continuar: cómo se te ocurre hacerlo?

Recuerda que hay mil formas de resolver este tipo de ejercicios.

Lo que estamos haciendo con estos threads es tener más herramientas a la mano y poder elegir la que nos haga el trabajo más fácil!
Como este es mi ejercicio favorito, ya tengo en mente la solución que usaría!

Y para poder resolverlo, tenemos que sacar de la caja de herramientas el algoritmo DFS.

DFS es un algoritmo para recorrer grafos.
DFS, o Depth First Search, es un algoritmo que recorre los paths de un grafo a profundidad.

Qué significa esto? Que conforme avanzamos en el grafo, vamos a visitar los nodos de alrededor. Y así hasta que no haya más nodos en ese camino.
Pero bueno! Lo mejor es que lo expliquemos paso a paso!

Aquí tenemos un grafo, muchos nodos y muchas flechas que nos indican la dirección. Image
2 reglas de DFS

- No importa en que nodo comiences. En los grafos, a diferencia de los árboles, no hay un solo padre!
- Un nodo no se puede visitar dos veces. Super importante 🚨
DFS usa un stack para saber el camino que estamos creando al visitar los nodos.

En esta ocasión, elegiré “a” para empezar. Y lo pondré en el stack para saber el camino que estoy creando. Image
a tiene que nodos vecinos: b,c y g. Podemos elegir cualquiera para avanzar.

Elijo “c” y lo pongo en el stack. Image
c solo tiene un vecino -> d. Ponemos d en el stack y avanzamos Image
d tiene dos vecinos: e y f. En esta ocasión elijo a e, lo ponemos en el stack y avanzamos. Image
Y ahora vemos porque DFS es acerca de búsqueda en profundidad: agarramos un solo camino, y paramos hasta llegar al final.

e es el final de este camino.

Lo sacamos del stack, y ahora ese stack nos dice que el paso previo era d!

El vecino de d que queda por visitar es f. Image
De f nos vamos a g! Y guardamos g en el stack.

Antes de seguir, cual crees que sea el siguiente paso? Visitar c? Image
Nope! Recuerda: solo podemos visitar cada nodo una sola vez. Y ya visitamos a c antes.

Por lo tanto, este camino esta completo.

Retrocedemos todos los pasos que tenemos en el stack, y nos damos cuenta que solo queda un vecino de a por checar: a -> b Image
Y de nuevo, b tiene dos vecinos, d y e.

Pero estos ya fueron visitados antes, por lo que hemos recorrido todo el grafo!

Este es el poder de DFS.

Pero, cómo vamos a aplicar DFS en el ejercicio de Number of Islands?
🌟 Bueno, lo que decía el ejercicio number of islands es que nos iban a dar data en forma de un array m * n.

O sea, un array m* n es una matriz.

Y las matrices son grafos!
🧑🏽‍💻 Aún no hemos codeado porque necesitamos definir nuestra estrategia.

Ya sabemos que un DFS nos va a ayudar.

Ahora tracemos el algoritmo antes de codear.
Para hacer más visual el ejemplo, a cada elemento le asigné una letra. Cada elemento es un índice de la matriz, que realmente se podría acceder de la forma array[i][j]

Pero para cuestiones prácticas, las letras serán lo mismo.

Empezamos con 0 islas. Image
Comenzamos a recorrer la lista. Si empezamos desde array[0][0], significa que nuestro primer paso es desde A.

A tiene un valor de 1. Descubrimos un pedazo de una isla! Pero no sabemos aún de que tamaño es la isla.

Hora del DFS! Image
Primero incrementamos el contador de islas a 1.

Mmmm, necesitamos registrar de alguna forma que este nodo fue visitado.

Qué tal si cambiamos los 1s que encontramos a 0s? Si es un 0, ya sabemos que no tenemos que tomar acciones extras! Image
Cambiar los 1s a 0s nos ayudará a simplificar nuestro algoritmos.

Nuestra condición será:

- Si el nodo es 1, sigue avanzando.
- Si es 0, encontramos el final de un camino. Hora de parar.
Los vecinos de A son B y F.

Vamos a recorrer a los vecinos con algún patrón.

Yo elegiré arriba, derecha, abajo, izquierda. Si el vecino se sale del array, será undefined.

En esta ocasión, arriba es undefined, derecha es B, abajo es F e izquierda es undefined.
Dado que no hay valor hacia arriba, nos vamos al vecino de la derecha, que es B.

Nuestra meta cuando estamos buscando vecinos es ver que tan grande es la isla!

Y luego volvemos a hacer lo mismo: cambiamos el valor de 1 a 0, y buscamos nuevos vecinos.

Hora de moverse a C! Image
Y de nuevo! Cambiamos C de 1 a 0.

Este va a ser el patrón del algoritmo!

Checamos vecinos: D y H. Pero ambos son 0, por lo que llegamos al final de este camino.

A movernos unos pasos atrás. Image
Volvemos a B! Y en esta ocasión, nos movemos a G.
Transformamos G de 1 a 0, y proseguimos a F.
Ya casi terminamos este camino! Image
Y de nuevo! Estando en F, lo cambiamos de 1 a 0.

Los vecinos de F son 0, por lo que hemos llegado de nuevo a otro final! Image
Recorremos todos los pasos hacia atrás que teníamos guardados en el stack, y volvemos a A.

Esto significa que transformamos toda la isla de 1 a 0. Y esto nos va a ayudar en el futuro a no confundirnos conforme buscamos más islas.

Este DFS se acabó. Image
Seguimos recorriendo nuestra matriz. Nos habíamos quedado en A.

Vamos a seguir moviéndonos hasta encontrar otros 1.

Y esta ocasión, ese 1 está en E. Image
Recuerda! Cuando encontramos un 1 desde nuestro recorrido en la matriz, significa que encontramos una isla, y por ende, nuestro contador de islas incrementa.

Ahora tenemos 2 islas!

Transformamos E en 0, y comenzamos un nuevo DFS! Image
Ah! Pero este DFS estuvo cortísimo! 😅 Los vecinos de E ya son 0.

No hay nada más que transformar!

DFS termina, y seguimos recorriendo este grafo.
Aquí ya podemos ver las ventajas de haber transformado los 0s en 1s. Conforme seguimos recorriendo, no tenemos que hacer cosas complicadas para saber si algo era una isla antes o no.

Nuestro algoritmo solo es: si encuentras un 1, es el principio de una isla. Image
Cambiamos I de 1 a 0, e incrementamos el contador de islas a 3. Image
Y volvemos a elegir como vamos a visitar a los vecinos
- Arriba D -> es 0, lo saltamos
- Derecha J -> es 0, lo saltamos
- Abajo H -> es 1, a visitar! Image
Cambiamos H a 0, y de nuevo, a visitar vecinos.

En esta ocasión solo nos queda O. Cambiamos O por un 0, y… Image
Hemos acabado el DFS del nodo I! Image
Seguimos recorriendo el resto de la matriz, y ahora si, ya no encontramos más 1s.

Significa que el resultado final fueron 3 islas! Image
💡Ahora si, ya tenemos una buena estrategia. Conocemos los patrones que se repiten y el algoritmo que vamos a usar.

Hora de codear!
Empecemos con lo básico

Lo que tenemos que hacer sin duda alguna es recorrer el grafo.

El grafo se representa como un array de arrays, donde el primer array son las filas y el otro array las columnas.

Por ello necesitamos dos for -> #javascript Image
Ahora, recuerdas que todo empezaba cuando encontramos un “1” ?

Necesitamos una condición. Cuando encontremos “1”, incrementamos el contador de islas, e invocamos nuestro DFS.

Vamos a necesitar pasarle el grafo y los indices de donde vamos a comenzar. Image
🌟 Para el DFS necesitábamos 1 stack para saber el camino que estábamos recorriendo.

Pero… no necesitamos explícitamente esa estructura.

Normalmente, los DFS se estructuran usando *recursión*

La recursión es un stack de llamadas!
El primer paso del dfs es transformar el nodo en un 0!

Ahora nos falta decirle que tiene que moverse entre los vecinos.

Hora de la recursión. Image
Dentro de dfs, volvemos a llamar a dfs!

Para movernos, solo tenemos que enviar los indices que ya teníamos, pero con incrementos o decrementos, para movernos arriba, derecha, izquierda, abajo.

Pero, esta recursión nunca va a parar! Nos falta decirle cuando detenerse. Image
Una condición más será suficiente.

Nuestra recursión debe parar si:
- El valor del nodo es 0
- No hay más filas a donde moverse
- No hay más columnas a donde moverse Image
🌟 Y listo! DFS nos ayudó a simplificar nuestro problema.

El hecho de saber que existe DFS nos ayuda a aplicar algoritmos comunes a cualquier tipo de problemas, y poder tener una base sólida sobre la cual resolver problemas más complejos.
⚡️ Lo que se busca en las entrevistas no es dejar un ejercicio difícil, o platicar de temas que no se tocan en el día a día.

Es descubrir como pensamos y juntamos muchos elementos pequeños para crear soluciones sólidas.
Y esto es todo! Este ⚡️#thread estuvo largo, pero DFS es de mis algoritmos favoritos.

No es fácil de entender a la primera, así que siéntete con la confianza de preguntarme las dudas que tengas.
Nos vemos pronto en otro ⚡️#thread de “Ejercicios de la entrevista enfocada a algoritmos en FAANG!” #javascript

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with Charlie L ⚡️

Charlie L ⚡️ Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @charliesbot

Nov 14, 2023
Uno de mis temas favoritos es conocer como se crearon las empresas que mantienen nuestras apps favoritas, pero no desde el punto de vista técnico o motivacional

Sino saber los altibajos, retos y dudas por las que pasaron para llegar al día de hoy

Estos son mis 5 libros top 🧵
Hatching Twitter

La historia de Twitter me parece como si hubieran traido Game of Thrones a Silicon Valley

Es una historia llena de traiciones por dirigir una empresa que crecía demasiado rápido, y donde el ego no deja de ser protagonista Image
Creative Selection es la perspectiva de un ex-empleado de Apple acerca de porque esta empresa consigue seguir innovando conforme pasa el tiempo

Me encanta porque habla de transiciones que ahora damos por hecho: la historia del teclado digital y la llegada del touchscreen Image
Read 7 tweets
Feb 25, 2023
Una de mis entrevistas d trabajo favoritas para frontend consistió en que me daban un organigrama de una empresa, representado por un árbol

Donde veías a los managers, y a la gente bajo su cargo

Te daban un mock de la UI y la pregunta era: cuantas personas hay por organización? Image
Era un ejercicio para resolver en casa

Se me hizo un gran ejercicio para poner a prueba los conocimientos de front end y de algoritmia!

Pq veías a los C-levels (CEO, CFO, etc) y de ahí, managers de managers de managers... hasta llegar al último nivel

Era un organigrama gigante
Resolverlo a mano no tenía mucho sentido. Y además, había una pregunta de seguimiento en la entrevista en persona que evitaba esto 😅

Es entonces cuando entran los algoritmos!

Existe algún algoritmo que nos permita recorrer todo el árbol en profundidad, para explorar los nodos?
Read 7 tweets
Feb 20, 2023
Hablando de feature flags en software engineering

Una ventaja de usarlos no es solo para validar experimentos.

También ayudan muchísimo a poder lanzar código más rápido al branch principal, condicionando todo el nuevo código detrás de estas banderas
En lugar de crear un branch gigante en torno al nuevo feature, puedes agregar todos tus cambios incluso en prod, minimizando el riesgo de romper el build principal porque tus cambios no se activan si la bandera no está habilitada
Además de acelerar el flujo de desarrollo, también ayuda a que mantener los cambios sea sencillo, porque al final no tienes que mergear un branch gigante contra el branch principal

Y, como beneficio extra...
Read 5 tweets
Feb 20, 2023
Hay algunos productos entre los que salto de vez en cuando. Y me gusta ese balance para no amarrarme a un ecosistema

Aunque hay casos en los que todavía no encuentro algo a la par!

Mis gadgets favoritos son...

[1/x]
Celular: Pixel 7 Pro. Aunque tengo un iPhone guardado just in case!

Tablet: salto entre el iPad Pro y la Tab S8+. Del iPad me encanta Good Notes y ProCreate. De la S8+ me gusta la flexibilidad del multitasking

Laptop: Macbook 14 Pro. Aún no encuentro una buena alternativa
Watch: El Apple Watch para mi era el gadget que me hacía volver cada 6 meses a iOS. El Galaxy Watch no me gusta tanto

Pero el Pixel Watch si me tiene super a gusto!

Y la lista puede seguir y seguir, incluyendo audífonos, servicios, etc
Read 5 tweets
Feb 18, 2023
Esta semana me sentía super estresado porque tengo muchas tareas de la misma prioridad este Q1, y todas requieren mucha colaboración entre teams

Hoy me lancé a hablar con mi manager pq *salud mental*. Y se resuelve con una pregunta: de todo esto, que tiene más prioridad?

[1/x]
Se me hizo bonito que mi manager me agradeció por preguntarle por las prioridades en lugar de asumir ❤️

Y una vez que me dijo que realmente urgía este Q1, el estrés se me fue de inmediato

Y eso es algo que te quiero compartir hoy
Muchas veces, todo el estrés, la incertidumbre, el síndrome del impostor, etc, se resuelve quitandose la pena y preguntando al team ❤️

No hay preguntas tontas, o preguntas que te hagan ver como si no supieras nada

Para eso son los equipos! Para crecer juntos
Read 4 tweets
Sep 17, 2022
Me causa ruido cuando uno de los tips que se comparten para crecer en seniority es *NO PREGUNTAR*

En mi camino como Googler, he tenido 3 mentores. Y con cada uno, uno de los consejos que más se repite es: tener el soft skill de preguntar

Que significa esto?

🧵
Preguntar es un soft skill que implica salir de la zona de confort y estructurar tus ideas

También, cuando incluyes el costo por hora de un dev, preguntar ahorra dinero

Qué es mejor: investigar por tu cuenta algo por horas, o ir directo con alguien experto en ese feature? 💸
Uno de mis mentores, que es Principal (o sea, tres niveles arriba de Senior), me comentaba que su manager, que es Director en un team de Cloud, seguido le preguntaba cosas de partes del proyecto

Me lo ponía como ejemplo de que su Director no aparentaba saberlo todo
Read 6 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us!

:(