Transcripciones
1. Introducción: Mi nombre es Sarnoff, y soy ingeniero de software de pila completa e instructor de ingeniería. Ya le he dicho a Ingeniería de software en un boot camp de codificación, y algo que noté repetidamente fue que se están graduando Estudiantes, aunque extremadamente brillantes y capaces de construir sitios web poderosos, dinámicos, no
estaban listos para el tipos de preguntas que vieron en sus entrevistas. Después de ver a estos estudiantes luchar con preguntas típicas de entrevista, decidí crear y recolectar preguntas que los estudiantes pudieran ver en sus entrevistas. Y yo los repartí. Fue práctica extra para que los estudiantes lo intentaran. repetidas ocasiones me dijeron cuánto los problemas les ayudaban a ver los agujeros en sus conocimientos y los cayeron con las habilidades que necesitaban. Este curso es la culminación de esas preguntas. Casi todos estos problemas son variaciones en preguntas que yo mismo me han hecho, o que otras que conozco se han hecho en entrevistas. Bueno, no
verás estas preguntas exactas en tus entrevistas. Las estrategias que aprendes al resolverlos nuestro público son aplicables en casi todos los problemas que te darán. Aquí está la estructura general del curso típicamente empezará por crear un
algoritmo de fuerza bruta que solucione bien el problema, luego refinarlo hasta que podamos optimizar la complejidad del tiempo o del espacio o ambos. Al final del curso, habrás dominado varias estrategias algorítmicas que podrás aplicar de punta una amplia gama de problemas. Aprenderemos formas de analizar críticamente los algoritmos que ideamos y de encontrarlos, voltearlos para reducir la cantidad de tiempo que tardan. Esto es exactamente lo que busca un entrevistador. Hay un par de requisitos para este curso. Um, primero, debes tener un conocimiento básico de trabajo de JavaScript y la capacidad de escribir
código significativo con él. También debes estar familiarizado con los conceptos Básicos ES 2015, como funciones cero y las palabras clave Let y Const. Deberías tener alguna idea de lo que significan los términos, la complejidad del
tiempo y el espacio. Está bien si no sabes exactamente cuáles son, ya que caminaremos por encontrarlos a detalle para cada solución. El editor de códigos que uso en mis videos es Ripple. Uh, puedes llegar ahí yendo a rebelde punto i t slash lenguajes slash javascript, y la razón por la que uso esto es porque es simple y funcional, y vamos a enfocarte en tu código, pero eres por supuesto, libre de usar cualquier editor de código que te guste. El proyecto para este curso es recoger cualquiera de los problemas cubiertos en la clase. Aquí hay un total de cinco listados y comparte tu propia solución. Existen 1000 formas de resolver cualquiera de estos problemas y la clase se beneficiará al ver tu versión. Bienvenido al curso. Me emociona enseñarte lo que sé y ayudarte a as en tus entrevistas. Cuando estés listo, te
veré en el primer problema.
2. Subsets de Array: El siguiente problema es un subconjunto de rayos para este problema. Nuestra función va a recibir dos argumentos los cuales ambos van a ser un raise, y estas matrices solo contendrán números y cadenas. Nuestro objetivo es averiguar si la segunda matriz es un subconjunto de la primera son a y lo que eso significa es que queremos regresar. Cierto. Si cada elemento de la segunda matriz también se encuentra en el 1er 3 tenemos un par de pistas aquí. Como de costumbre, Este problema tiene algunas soluciones diferentes con diferentes complejidades de tiempo, y vamos a seguir adelante y cubrirlas todas. Y una de las claves de este problema es cómo lidiar con las repeticiones cuando un artículo está presente dos o tres veces. Estos son algunos ejemplos para este 1er 1 Los mismos artículos están presentes tanto en un raise, los mismos artículos exactos solo en un orden diferente. Por lo que sabemos que el segundo es un subconjunto de la primera en la siguiente Tesis y Array tiene 12 y tres, y el primer Array tiene uno extra, por lo que sigue satisfaciendo nuestras condiciones en la siguiente. El segundo array tiene un tres que la primera matriz no. Entonces queremos esto. Queremos que nuestra función devuelva False. Para este caso y el siguiente, tenemos dos extra. Por lo que de nuevo falso y luego el 3er 1 Aunque los ítems, el número de ítems es el mismo, estos tres ítems no aparecen en la primera tasa. Sólo uno de los sí lo hace. Entonces, de nuevo, queremos falso retorno. Prueba el problema y sigue adelante y presiona play cuando al menos lo hayas intentado. Empecemos. Entonces, como de costumbre, vamos a necesitar un bucle. Pero, ¿de qué manera queremos? Un bucle sobre. Bueno, queremos asegurarnos de que cada elemento de la segunda matriz esté presente en la primera. Entonces todo lo que realmente nos importa es cada elemento en la secundaria. El 1er 1 podría tener algunos extras que no nos importan. Por ejemplo, éste. Entonces parece que sería una mejor idea recorrer el 2do 1 ¿Y qué queremos hacer aquí? Bueno, cualquiera que sea el artículo en el que
nos encontramos actualmente, queremos buscarlo en el primer array del super set. Entonces aquí solo estamos usando el índice de método para encontrar donde en el super set
existe este ítem . Si existe enfermo. Si no lo hace, entonces Super Index será igual a uno negativo y podemos devolver de inmediato falso. Lo que esto significa es que hay un elemento en la segunda matriz, no en la 1ª 1 así que sabemos que no puede. El 2do 1 no puede ser posiblemente un subconjunto, por lo que podemos devolver inmediatamente false y al final de la función. Y si todo va bien, queremos volver verdad. Adelante y probemos esta función y no obtenemos del todo lo que esperamos que
funcionen estos . A éste le funciona. Llegamos a tregua de falsas y luego dos verdades. Por lo que estas dos condiciones están fallando. Echemos un vistazo a este. Bueno, una condición fácil que podemos descifrar de inmediato es que un subconjunto tiene que ser menor o igual al tamaño de su super set. Entonces si los subsidios cada vez más grandes, entonces sabemos que no puede ser posiblemente un verdadero subconjunto. Entonces sigamos adelante y al respecto. Está corriendo de nuevo y esto pasaba. Vamos a conseguir un falso aquí, pero aún tenemos que hacer pasar esta pieza aquí mismo, y no hay manera fácil de evitar eso. Por lo que nuestra función aquí es casi completa. Pero hay una cosa importante que tenemos que hacer, y es. Lleva un registro del número de cada ítem que aparece, y lo haremos en la siguiente lección.
3. Algoritmos de la doble Array buceo profundo: Bienvenido de nuevo al subconjunto de matriz. Ya casi terminamos con nuestra función. Todo lo que tenemos que hacer es hacer que este caso aquí mismo falle por el momento. Pasa la prueba y nos hacemos realidad volviendo de nuestra función. Lo que necesitamos es falso volver porque esta matriz no es un subconjunto de esta matriz. ¿ Cómo podemos hacer eso? Bueno, por el momento, lo que están haciendo loop es que está pasando por esta segunda matriz y su procesamiento cada elemento la primera vez que ve éste. Lo busca en esta matriz y dice que está ahí. A él le parece genial. Continúa en el bucle y vuelve a llegar al siguiente. Espera hacia adelante en el primer Array y lo encuentra y encuentra exactamente el mismo. Y dice:
OK, OK, estamos bien para ir y hace eso una vez más. Tenemos que decirle que no puede mirar este ítem esta dos veces y no puede mirar el mismo ítem varias veces. Si un ítem aparece más de una vez en el subconjunto, tiene
que aparecer al menos ese número de veces en el super set Bueno, una cosa podemos dio, es simplemente eliminar los ítems que encontramos en el super set que solucionaría el problema. Por ejemplo, cuál es la función busca ésta y la encuentra aquí al encontrarla. Podemos simplemente eliminarlo de la matriz. La próxima vez que se vea desde
ella, busca al que no lo encontrará ahí y devolverá falso. Entonces vamos a seguir adelante y codificar que en un principio no queremos modificar directamente esta matriz se dieron, Así que hagamos una copia de la misma. Perdón, Súper copia. Y con el operador spread, esto es todo lo que necesitamos hacer para hacer una copia de este primer array. Y intentemos volver a ejecutar esto y todas nuestras pruebas pasan este trabajo funcional. Sigamos adelante y veamos las complejidades del tiempo y del espacio. Entonces, por el tiempo, vamos a llamar a esta M, y para ello, en realidad
tenemos dos variables diferentes. Por lo que necesitamos mantener nuestra complejidad del tiempo en términos de ambas variables. Aquí tenemos y todos em. Ah, tenemos un no de em proceso copiar una matriz toma lo que tenemos que hacer es tener el dedo del pie bucle a través de la matriz y copiar cada elemento individual. Entonces esta es una operación lineal justo aquí en este bucle, empezamos con más de N para secundaria y aquí estamos en realidad tenemos otro bucle ha mencionado en un problema anterior. Índice de es un bucle y estamos buceando sobre super, que en nuestro caso, es M Así que no tenemos o de m aquí porque están en un bucle. Los multiplicamos juntos y obtenemos todos los tiempos em n y porque O de m veces n es un factor mayor que éste que podemos después. Adelante e ignora esto porque es inconsecuente para la complejidad del espacio. Creamos una nueva matriz copiando el original. Entonces va a ser o de M. Hay una forma diferente de resolver esto, y en realidad mejorará un poco nuestra complejidad del tiempo. Adelante y trabajemos en eso. Entonces en lugar de operar así, donde estamos buceando a través del subconjunto y luego tratando de encontrarlo que el super set
se pararon yendo dedo del pie bucle a través de cada uno por separado y mantener la cuenta para que podamos mantener esta parte superior, no necesitaremos ninguno de esto más y mantendrá el retorno verdadero en la parte inferior. Entonces ya hemos empleado esta estrategia con anterioridad, pero lo que vamos a hacer es crear un objeto para hacer un seguimiento de estos números. Sólo voy a etiquetar este ganado. Entonces lo que estamos haciendo es primero buceando por el super set y construyendo este objeto para cuando terminemos, Lo que queremos que tenga este objeto es una representación de cada elemento que está aquí, lo que significa conteos correctos. - Entonces este es el caso. El comunicado CIF es el caso en el que se encontraban por primera
vez con una cadena o número . Entonces si es la primera vez, queremos darle un valor de uno. Si lo hemos visto antes, sólo
queremos incrementarlo, ¿de acuerdo? Y eso es todo lo que queremos hacer frente a este bucle. Este bucle contendrá un recuento correcto de todos los elementos aquí presentes. Y vamos a cerrar eso para asegurarnos, y vamos a seguir adelante y probarlo con sólo dos. Este último artículo aquí. Entonces estamos ejecutando este ejemplo aquí mismo, y estamos buceando a través de esta matriz y eso parece correcto. Vemos uno apareciendo unos a aparecer una vez y tres apareciendo una vez y solo para asegurarnos absolutamente seguros. Añadamos otros tres. Después vuelve a ejecutarlo y vemos tres dos veces. Entonces esto parece que está funcionando. Bien. Vamos a seguir adelante y recorrer el segundo array. - Entonces aquí estamos procesando un elemento en nuestro subconjunto, y estamos tratando de asegurarnos de que se encuentre en nuestro objeto de cuenta. Si no lo hemos visto antes, lo que significa que esto es indefinido. Sabemos que tenemos algo presidente, el subconjunto que no tenemos en el super set. Porque si lo hiciéramos, habría sido almacenado en este objeto por este bucle. Entonces si este es el caso aquí mismo, podemos seguir adelante y devolver falso. No obstante, si no es indefinido, sólo
queremos disminuir su valor en uno. Por lo que esto disminuirá nuestra cuenta. ¿ Qué pasa? Uno. El número llega a cero. Lo que estamos haciendo aquí es que si el Conde alcanza cero, estamos borrando el ítem por completo de nuestro objeto del conteo. De esa manera, si volvemos a procesar ese artículo, pasaremos por este bucle y entraremos en este caso. Lo que eso significa es que hemos encontrado este ítem más veces en el subconjunto de las que tenemos en el super set, lo
que significa que no es una tregua molesto, y podemos devolver falso. Trata de tratar de envolver tu cabeza alrededor de eso. Sigamos adelante y contemos nuevamente solo para asegurarnos de que funciona bien al final del segundo bucle. Entonces esperamos ver,
veamos , uh, vemos falso porque está regresando falso. De acuerdo, cambiemos un poco esto y hagámoslo 123 Entonces lo que deberíamos ver es un objeto vacío. Y eso es exactamente lo que hacemos. Vea, debido a que este bucle procesó desarreglo y este bucle procesó desarreglo, esencialmente se
cancelaron entre sí. Se agregaron artículos y se contabilizaron y luego se eliminaron por este bucle aquí mismo. Entonces no deberíamos ver nada saliendo, y esto parece que está funcionando de la manera que esperamos. Sigamos adelante y ejecutemos estos y veamos si nuestra función está funcionando correctamente y aún así conseguimos un verdadero por aquí. ¿ Por qué es eso? Uh, no cambió esto de vuelta y está funcionando exactamente como esperamos. Echemos un vistazo a la complejidad del tiempo para este. Entonces tenemos una O de en este caso vamos a los súper sets, todos em. Y nada aquí dentro es un bucle. Y aquí tenemos una O de N. Entonces nada aquí es un bucle. Entonces esta vez, porque estos bucles van tras uno y no tenemos uno dentro de otro en lugar de multiplicarnos. Lo que vamos a hacer es sumar estos dos juntos, así que obtenemos O de M más n por complejidad espacial. Estamos almacenando cada elemento en el super set en este objeto de recuento. Entonces eso sólo se va a quedar o de M. Así que esta solución funciona perfectamente bien. Y en el siguiente video vamos a seguir adelante y averiguar cómo resolver este problema si no nos dan solo cadenas y números en nuestras matrices aquí. Pero haremos que esto funcione para cada tipo de insumo viendo la siguiente lección.
4. Subconjunto de Array: la solución óptima: bienvenida de nuevo en el último video, logramos resolver el problema del subconjunto de matriz. Nuestra solución está aquí abajo y no funciona para cada ejemplo aquí. Y funcionará para cada ejemplo en el que usamos cualquiera de los números. Este es un tipo de me disculpo, debo decir, o funcionará para cualquier entrada en la que le demos ya sea números o cadenas. En este caso, todos
son números aquí abajo. Pero funcionaría si las reemplazamos por cadenas igual. Y esto es clave. Nuestra solución sólo funcionará para números y cadenas. Si tratamos de usar objetos, un raise o funciones son nuestra función aquí se va a descomponer y vamos a repasar. ¿ Por qué notar que almacenamos toda nuestra información en un objeto aquí? Los objetos son geniales, pero tienen un poco de carencia. Y hablemos de qué es eso. - Entonces
todo lo que he hecho aquí es crear un objeto y luego intentar crear 33 pares de valores clave, uno con un objeto, uno con una cadena y otro con un número. Y cuando largamos el objeto, esto es lo que conseguimos aquí mismo. Esto no es lo más útil Así que vamos a registrar cada elemento individualmente y los vemos aquí, así que eso está funcionando correctamente. También loguemos en lugar del valle aquí. Vamos a seguir adelante y registrar el tipo de la clave y notamos que cada vez que obtenemos cadena , esta es la mosca de la que hablaba. Siempre que usamos corchetes con un objeto para ya sea conjunto de variable o acceder a algo, lo que sucede internamente es que este ítem, pase lo que pase a ser primero, se convierte en una cadena. Por lo que este objeto aquí mismo se convierte en el objeto objeto objeto string. Y eso sólo pasa a ser como esta plataforma ripple decide usarlo. Otros simplemente podrían llamarlo una cadena con la palabra objeto en ella. O podría ser otra cosa. Podría ser incluso este corchete de cadena, pero aquí es objeto objeto, y de hecho es una cadena 25 también se convierte en una cadena. Entonces en lugar de ser realmente el número 25 lo que entra aquí es la cuerda 25. Ahora bien, si tenemos múltiples objetos y tratamos de usarlos a ambos, veamos qué sucede. El problema es que estos dos, aunque sus distintos objetos. Como podemos ver aquí, claramente
hicimos dos objetos separados. Ambos son coaccionados en el mismo objeto objeto de cadena justo aquí. Y eso significa que uno de ellos simplemente no se inserta. Más bien, insertamos esto y entonces esto lo anula por completo. Solo para mostrarte que eso está pasando, también
obtenemos un objeto. Por lo que esto se ha eliminado esencialmente de nuestro objeto. De acuerdo, ya
tenemos eso terminado. Vamos a seguir adelante y discutir cómo solucionar esto en realidad. Entonces en lugar de un objeto aquí, vamos a usar algo diferente. Vamos a utilizar un constructo E S 2015 llamado mapa. Ahora, un mapa es básicamente lo mismo que un objeto excepto él. En lugar de cadena desafiando sus claves, las mantendrá como están. Por lo que es un objeto que contiene pares de valores clave, y cualquier valor puede usarse como clave, no solo para encadenar el uso de simplemente bastante simple. Puedes seguir adelante y leer la documentación para aprender los métodos, pero este ejemplo de aquí te dará todo lo que necesitas saber al respecto. Y como usamos los métodos estarán hablando de ellos de todos modos. Así que sigamos adelante y sumérjase directamente. Entonces, en lugar de un objeto para crear un mapa, usamos nuevas matemáticas para buscar un elemento en lugar de comprobarlo. Si es indefinido, usamos un método llamado tiene y no necesitamos esto. Si el artículo está presente en nuestro mapa, esto devolverá verdadero. De no ser
así, será falso. En lugar de establecer en lugar de establecer un par de valores clave de esta manera, lo
hacemos de manera diferente. Usamos set, y el primer ítem que le damos va a ser lo que queremos establecer, que lo hará. Perdón, Va a ser la llave que quisiéramos poner. Entonces ese va a ser el rubro actual. Y luego el número de que queremos darle en este caso uno. Tendríamos que cambiar esto también. ¿ Y qué ponemos un segundo valor? Bueno, queremos establecer. Queremos ajustarlo a lo que sea que sea el valor actual más uno. Acabo de darme cuenta de que esto tiene que tener un signo de exclamación porque lo que estamos tratando de hacer aquí es comprobar y ver. Estamos tratando de asegurarnos de que nuestro mapa aún no tenga este ítem. Si no tiene el ítem, queremos establecer su valor en uno. Y si sí tiene el ítem, queremos aumentarlo en uno. Entonces esto es correcto. Pasando a nuestro segundo bucle para esto, en realidad
podemos reemplazarlo con esto exactamente como es porque estamos tratando de comprobar exactamente lo mismo. Esto aquí mismo puede ser reemplazado por esto con un pequeño cambio. Entonces en lugar de sumar uno, como estamos haciendo aquí, queremos restar uno. Entonces para disminuir este recuento de ítems, estamos obteniendo su valor actual restando uno y estableciendo su nuevo valor a ese número aquí, En lugar de acceder a esto como lo
haríamos con un objeto, solo vamos a usar el método de montaña apropiado. Y aquí estamos usando el mapa de métodos, Doc delete y simplemente queremos pasar, oops, elemento
actual y esto esperemos que funcione. Obtenemos exactamente los mismos valores de los que esperamos, por lo que parece que está funcionando. Te animo a cambiarlos y probarlos con objetos, matrices, funciones, cadenas y números todo en el mismo ejemplo. Esta nueva función que tenemos aquí debería funcionar por cualquier cosa que se le dé. Las complejidades del tiempo y del espacio siguen siendo las mismas. Un mapa es básicamente equivalente a un objeto, justo con esta nueva característica agregada donde las claves no tienen que ser cadenas. Eso es todo. Nos vemos en el siguiente video.
5. Máximos beneficios a través de Brute Force: bienvenidos al siguiente problema. Máximas ganancias por este problema. Nos van a dar una matriz de números que representa los precios de una acción desde el principio del día hasta el final del día. Por ejemplo, dada esta matriz aquí, las acciones comenzaron a un precio de 10 y terminaron en un día a un precio de nueve. Y pasó por estos en orden durante ese día y pasó por estos precios. Nuestro objetivo es encontrar el máximo beneficio posible comprando una vez y vendiendo una vez en un solo día
dado. Entonces a partir de esta matriz, queremos encontrar el máximo beneficio que podemos obtener. No hay cortocircuito, lo que significa que debes comprar antes de vender y si no se puede obtener ningún beneficio. Por ejemplo, si el precio de las acciones acaba de bajar todo el día y esto se veía como 10 98765 Entonces en lugar de devolver un número negativo, sólo
queremos devolver cero para indicar que posiblemente no se puede obtener ninguna ganancia. Adelante y empecemos como de costumbre. Vamos a necesitar nuestro cuatro bucle y lo que queremos hacer. Empezaremos con la estrategia de fuerza bruta, que significa calcular cada posible cada beneficio posible que podamos obtener y luego devolver el más grande que encontremos. Y pensemos en cómo hacer eso. Entonces si lo compramos 10 y vendimos a las siete, somos beneficio será negativo tres. Y queremos guardarlo en algún lugar. Si viéramos si lo compramos 10 y vendimos a las cinco, nuestra ganancia sería negativa. Cinco lo compraron 10 y lo vendieron ocho. Y sigue y sigue y sigue. No ganaríamos mucho dinero comprando a las 10. Destruye siete. Por lo que por sus siete se venden a las cinco. Nuestro profeta es negativo comprar a las siete. Celular a las ocho. Ganancias uno por sus siete Véndelo 11 ganancias por empezar a lucir bien. Simplemente pasaremos por esto una y otra vez hasta que obtengamos cada beneficio posible y luego regresaremos la más alta. Entonces para hacer eso notó que cuando empezamos a las 10 entonces tuvimos que procesar cada uno de estos. Cuando empezamos a las siete, tuvimos que sacar ganancias a cada uno de estos. Entonces vamos a necesitar un bucle dentro de este bucle. Me olvido de lo que va a tener este bucle aquí pienso lo mismo. Precios inicio longitud arriba. Veo que esto tiene que ser igual a un yo más uno porque queremos empezar después de la posición de y almacenar cada uno de estos beneficios posibles. Queremos crear una matriz. Y aquí, todo lo que necesitamos hacer es calcular el beneficio y ponerlo en la matriz al final, queremos devolver el máximo. Entonces lo que podemos hacer es usar la función math dot max y matemática. Not Max toma varios números, tantos
como quieras darle, y solo devolverá el número máximo. Entonces aquí podemos repartir nuestra matriz de ganancias. Ah, una cosa que me olvidé aquí queremos empezar esto con cero. Entonces si de nuevo, si los precios el aire simplemente bajando, yendo de ,
digamos, 928642 hombres, no importa donde compremos el no importa donde vendamos nuestra ganancia va a ser negativa. Teniendo esto aquí, aseguradoras de que el punto matemático max ganarán un mínimo cero cada vez. Por lo que eso resuelve la condición que mencionamos anteriormente. Donde si no se puede obtener ninguna ganancia queremos regresar. Cero. Adelante y probemos esto. Solo usaremos la Serie aquí mismo y esperamos ver a seis luciendo bien. De acuerdo, hablemos de la complejidad del tiempo en la complejidad espacial de este problema. Entonces tenemos un bucle que pasa por nuestro derecho y tenemos otro bucle que pasa por no todo ya sino por parte de la teoría. Esto definitivamente va a ser Oh, de End. Y este también va a ser oh, de n aunque no esté pasando por toda la matriz. En promedio, este bucle en realidad está pasando por la teoría de la mitad. Por ejemplo, a
partir de las 10 J se va a pasar por cinco números comenzando a las siete. Se va a pasar por cuatro, empezando a las cinco. Se va a ir ahí tres y luego dos y luego uno. El promedio de esos números es la mitad de la longitud de esta matriz, por lo que esto es técnicamente y más de dos. Pero dejamos caer constantes para que ambos 1/2 final se convierta, oh, evento. Y debido a que estos bucles están dentro uno del otro, nos multiplicamos. Por lo que obtenemos O de n cuadrado para la complejidad del espacio. En realidad estamos empujando este número de precios a nuestra matriz de beneficios. Por lo que esto tiene que almacenar cada cosa que este Lou produce. Por lo que en realidad también va a ser o de M cuadrado. Van a ser lo mismo. No hablamos de éste. Y esto en realidad también va a ser, oh de y al cuadrado porque las matemáticas en Max como un bucle en sí mismo, tiene
que buscar a través de toda la matriz y darnos el mayor número en hallazgos. Y el tamaño de la matriz como se mencionó, es más y al cuadrado. O es proporcional thio de fin cuadrado. Por lo que esto en sí va a ser o n cuadrado. Y agregaríamos esto al valor que obtuvimos del bucle y eso nos pone oh, de dos y al cuadrado. Y siempre dejamos caer a Constance. Por lo que esto sólo podía desaparecer, dejándonos con O de n cuadrado, que es lo que teníamos inicialmente. De todos modos, empezamos con más y al cuadrado y terminamos ahí, así que esto esencialmente no cambia nada para nosotros. Esa fue la solución de la fuerza bruta. Y en el siguiente video, repasaremos uno mucho más rápido
6. Máximos beneficios: procesamiento inteligente: en el último video, resolvimos este problema usando una solución de fuerza bruta. Estamos calculando cada beneficio posible que se pueda hacer y simplemente devolviendo el máximo . Adelante y probemos esto de una manera diferente. Entonces pensemos en lo que podríamos hacer para hacer esto en un solo pase. Tratemos de llevarle esto a O off, y actualmente está y al cuadrado, y hemos logrado que ella acabe y un par de veces antes. A ver si podemos hacerlo esta vez. Bueno, ¿cómo se calcula una ganancia? Tomas un número y lo siento, tomas un número y luego restas un número antes de él. ¿ Cómo se consigue tan usando ocho. ¿ Cómo obtenemos el máximo beneficio posible al vender a las ocho? Bueno, miramos a los de la izquierda, y encontraríamos el número más bajo que podamos. No es 10. No son siete. Se trata de cinco. Por lo que la ganancia máxima que podemos obtener aquí es de tres. Mirando a 11. ¿ Cómo averiguamos la mejor ganancia posible que podemos obtener al vender al 11? Bueno, eso sería encontrar el gran número aquí dentro. Perdón. El número más pequeño aquí y vendiendo. Entonces vendiendo a las cinco, podemos convertir esto en código si solo hacemos un seguimiento Del número más pequeño que hemos visto hasta ahora, podemos. Entonces a medida que avanzamos, restar cualquier número que encontremos de ese número. Déjame mostrarte a lo que me refiero. Por lo que sólo estamos usando dos variables aquí para hacer un seguimiento de estos dos valores a lo largo de nuestros hombres de
bucle. Precio que vamos a asumir es infinito y lo actualizaremos en cuanto empezamos. Loop y Max profit asumirán cero y lo actualizaremos siempre que tengamos que hacerlo. - nos Sólo
nosaseguramos de que esto funcione. Sí lo hace. Esta es en realidad toda nuestra solución. Caminemos de nuevo por lo que estamos haciendo. Estamos asumiendo que el precio mínimo comienza en el infinito. Entonces estamos diciendo simplemente básicamente, inserte un infinito aquí mismo en este bucle. Vamos a actualizar eso siempre que necesitemos a Teoh. Entonces a medida que nos
movemos por esto, lo vamos a actualizar. En realidad el Infinito no está aquí, así que estamos empezando a las 10. Y estamos diciendo que el precio mínimo que hemos encontrado hasta ahora es el menor precio de los hombres o el precio actual. Entonces lo más bajo del infinito o 10 obviamente van a ser 10. Por lo que los precios de los hombres ahora igualaron. Intento Max, beneficio va a ser el número actual que estamos procesando menos el precio mínimo que hemos visto hasta ahora. Eso es lo que sigue nuestra regla. Simplemente hacemos un seguimiento de estos dos a lo largo de nuestro bucle y los actualizamos siempre que necesitemos . Al final, tenemos Max beneficio ya almacenado en nuestra variable y debilitamos. Simplemente regresa que realmente es el simple tiempo y espacio. Hemos convertido un doble for loop en un solo bucle. Y ninguna de estas operaciones ocupa una cantidad significativa de tiempo. No son lineales ni nada más arriba ahí, solo operaciones de tiempo constante. Entonces no lo van a cambiar. Y vamos a CEO de una O de N complejidad del tiempo Primer espacio. Veamos qué estamos almacenando. Estamos almacenando dos variables aquí. Y no importa lo grande
que sea este perdón, no necesitamos almacenar más datos que estas dos variables. Entonces esto es después de bajar de N cuadrado a uno. Esta es la solución que ganaría al entrevistador. Es difícil y muestra la capacidad de lidiar lógicamente con los números y el tiempo. Es elegante, corto y dulce, y tiene las mejores complejidades de tiempo y espacio imaginables para un problema como este otra vez, Simplemente haciendo un seguimiento de unos números a través de su función y un poco de astucia, podemos traer abajo tanto nuestras complejidades del espacio como del tiempo considerablemente lo veré en el siguiente video.
7. Una mentación de una sola: su problema va a ser mutación única. Vamos a escribir una función que tomará dos cadenas, y necesitamos determinar si las dos cadenas son idénticas, excepto posiblemente una mutación. Hay tres tipos de mutaciones, y esos son inserciones de relaciones y sustituciones ins. Una eliminación es sólo la dilatación de un solo carácter e inserciones. El inserción de un solo carácter y una sustitución es un cambio de carácter, siendo las cadenas la misma longitud. Al final, adelante y pruébalo por tu cuenta y regresa cuando estés listo. Adelante y empecemos este problema, así que queremos empezar por escribir bucle. Pero, ¿en qué se ve bien esto? ¿ Te ves como? Bueno, en cada paso, básicamente
queremos comparar exactamente el mismo elemento y ambas cadenas. Entonces a medida que pasamos por esta cadena, queremos comparar el primer carácter aquí con el primer carácter aquí, el segundo carácter aquí con el segundo carácter aquí y así sucesivamente y así sucesivamente. Veamos cómo haríamos eso. En realidad, la clave está usando un tipo de bucle diferente al que hemos visto hasta ahora. Bueno, sigue siendo un bucle for, pero se va a estructurar un poco diferente. Adelante y anotemos las condiciones. Coma. Esto podría parecer un bucle extraño, pero es perfectamente legal. Caminemos por lo que está pasando aquí. Estamos declarando dos variables, y nuestra condición es Es más o menos una condición estándar. Acabamos de poner su declaración ahí dentro. Entonces si alguno de estos es cierto, si alguno de estos es cierto, nuestro bucle continuará y al final estaban implementando dos variables diferentes. A los dos que declaramos al principio. Pero discutiremos por qué estamos haciendo esto a medida que lo atravesamos. Por lo que queremos crear también una variable para hacer un seguimiento del número de mutaciones que tenemos
hasta ahora . Y vamos a empezar cero y aquí, básicamente, cuando queremos pasar con cuerdas uno por 11 carácter a la vez y mirar el número de mutaciones. Entonces, ¿cómo decimos si hay una mutación? Bueno, debemos comprobar si los personajes son simplemente iguales. Si los personajes son exactamente los mismos, queremos hacer nada y queremos con el bucle continuar. Pero si son diferentes queremos hacer algo. Entonces si no son iguales, sabemos que tenemos una mutación para que podamos escolarizar adelante e incrementar eso. Y ahora necesitamos determinar qué tipo de mutación es. ¿ Es una eliminación e inserción, o es una sustitución? Entonces hemos aumentado las mutaciones y hay otro cheque que realmente queremos dio. Entonces hemos implementado mutaciones, y si ya lo sabemos, tenemos que hacerlo, podemos volver de inmediato falso si no por sí mismo. Es la primera mutación. Entonces esto es lo que queremos hacer. Entonces aquí estamos diciendo que la longitud del primer ítem es mayor que la longitud del segundo ítem. Por lo que esto podría ser un ejemplo para éste o éste. Entonces si son iguales, en realidad
queremos embellecer a Amen la segunda variable. Y vamos a explicar por qué ese IHS tomando esto como ejemplo. Entonces estamos comparando un y A en nuestro bucle y son idénticos. Estamos comparando B y C, y estos son en realidad personajes diferentes. Entonces vamos a entrar en este bucle mutaciones se va a convertir en uno. Vamos a saltarnos esto porque la mutación es igual a una, y vamos a entrar aquí. Entonces vamos a disminuir a J. Y ese es el índice aquí mismo. Entonces estamos en el siguiente en ambos, y vamos a disminuir el índice de la segunda cuerda y traerlo de vuelta
a aquí . Entonces otra vez, para la primera cuerda, donde en B para la segunda cuerda, donde a un Vamos a pasar a la siguiente iteración del bucle y este sueño
pasamos a ver. Y en esta cadena, también
queremos ver Así que esencialmente, hemos vuelto a encarrilar la segunda cadena realizando esta operación aquí mismo comparamos C dos c aunque estén en índices diferentes y luego seguimos adelante. Ya que son idénticas, entonces incrementamos ambos índices nuevamente. Y de como lo mismo es profundo. Entonces estamos bien para ir. Sabemos que sólo hemos tenido una sola mutación y ahora podemos volver verdad y ya casi
terminamos aquí. Pero, ¿qué queremos hacer si hay una inserción en su lugar? Bueno, en ese caso, entonces la cadena uno va a ser más corta que una cadena a, y lo estamos haciendo en este caso, por ejemplo, para este, realidad
queremos una baraja Ament, la otra variable, y esto nos volverá a poner en marcha. Puedes seguir adelante y pasar por esto por tu cuenta y resolver esa lógica. Pero sí funciona. Esta es toda la función. Adelante y probémoslo. Seguiremos adelante y usaremos thes. Por lo que aquí esperamos ver verdad. Bueno, esto es probar uno de estos corriendo de nuevo. Cierto. Y probemos esto, uh, cometió un error ahí, y es cierto. Y para asegurarnos de que esté funcionando, probemos también algo que no funcione. No debería funcionar. Entonces aquí tenemos dos adiciones, por lo que esto debe ser falso, y vemos que es falso. Intentemos hacerlo. Sustitución es en cambio por lo que un BCD se convierte en una x x x d. Y otra vez nos ponemos falsos. Y intentemos volver a eliminar falsas. Entonces esto sí funciona. Sigamos adelante y pasemos por las complejidades del tiempo y el espacio para esta función. Entonces en el para el iban de I igual a cero a la longitud de la cadena. Las cuerdas I y J, sólo
estamos usando un bucle aquí y en este bucle, ninguna de estas operaciones son lineales thes air, todas las operaciones de tiempo constante, por lo que no van a cambiar el tiempo de complejidad de nuestro bucle. Simplemente tenemos que averiguar cuál es la complejidad temporal de este solo bucle, y va a ser lineal. Por lo general las cuerdas. Vamos a ser de longitud similar bastante similar. Y así podemos decir N es sólo la longitud de cualquiera de las cuerdas. En ese caso aquí, la complejidad del tiempo va a ser sólo, oh de N. Se
puede argumentar que pasamos por el doble porque estamos lidiando con ambas variables, yo y J. Pero eso sólo sería multiplicar esto por dos, y nos deshacemos de la constante de todos modos, Entonces eso nos dejaría con una complejidad temporal de o de n y cuál es la complejidad espacial? Bueno, mucho tiempo que sean estas cuerdas, solo
almacenamos tres variables I J y Mutaciones. Entonces eso en realidad va a ser o de una esperanza que ayudó. Y espero que eso tenga sentido y lo veré en el próximo video
8. Detección de Anagrams: todos ustedes anagramas. Aquí las instrucciones son tomar una matriz de cadenas y regresar. Verdadero si todas esas cadenas son anagramas unas de otras, anagramas significa que tienen los mismos caracteres en la cadena, pero podrían estar en un orden diferente. Aquí hay algunos ejemplos estos tres son todos anagramas el uno del otro. Todos contienen a, B, C y D, y sólo están en un orden diferente. En el siguiente ejemplo, tenemos una X aquí, lo que significa que no todos son anagramas, por lo que querríamos que la función devuelva False y los dos siguientes son bastante similares a esos. Adelante y pruébalo tú mismo y sigamos adelante y empecemos con la solución aquí. Entonces, como se mencionó un anagrama o más bien, anagramas, nuestras cuerdas que tienen los mismos caracteres, pero tal vez en un orden diferente. Entonces, ¿cuál es una forma de averiguar si dos cuerdas son anagramas? Podríamos hacer cuenta de cada personaje, y podríamos comprobar esos conteos al final una vez que hayamos procesado las cadenas. Pero hay una manera que es un poco más simple, y vamos a seguir con esa forma. En primer lugar, en realidad
podemos ordenar estos personajes. Entonces, por ejemplo, si ordenamos un B c D, se quedará exactamente como está. Si ordenamos este próximo anillo, se convertirá en un B C. D y hará lo mismo para éste, y también se convierte en un BCD. Las cuerdas, después de ordenarlas todas, se convierten en la misma cuerda exacta. Entonces si ordenamos anagramas unos de otros, todos
deberían convertirse exactamente en la misma cadena, y podemos usar esto a nuestra ventaja. Adelante y empecemos. Entonces, ¿dónde va a ordenar cada cadena de nuestro rayo usando la función de mapa? Entonces tenemos una cadena y queremos primero dividirla en una matriz. Por lo que ahora tenemos una matriz de personajes. Después usamos la función sort, y luego volvemos a unir esos caracteres en una matriz, y esto contendrá las cadenas, todo tipo de juntas. Vamos a asegurarnos de que tenemos eso bien, y eso está probado con este. Oops, eso se ve bien. Entonces, no, tenemos que hacer. Vamos a pasar por estas cuerdas y un bucle, y necesitamos asegurarnos de que todos sean iguales, como dijimos antes, y tenemos que querer empezar esto a cero. Lo sentimos uno. Esta es toda nuestra solución. Y para asegurarnos de que funcione aún, nos hacemos realidad. Probemos todos estos. Por lo que haciéndolos de uno a la vez aquí, esperamos falso aquí, esperamos verdadero. Y aquí esperamos falso otra vez y esto funciona. ¿ Y qué pasa con las complejidades del tiempo y el espacio? Por el tiempo vamos a tener que considerar esto en términos de dos variables diferentes. Normalmente, sólo
usamos n y decimos más y o en cuadrado o lo que sea. Pero aquí, vamos a decir s es la longitud de las cuerdas y A va a ser el número de cadenas en la carrera o simplemente la longitud de la matriz. Esto se debe a que las complejidades del tiempo y del espacio son extremadamente dependientes de ambas variables. Simplemente tiene sentido usar ambos. Cuando estamos hablando de estas complejidades del tiempo, las complejidades tiempo y del espacio. Entonces la complejidad del tiempo. Vamos a pasar por este de aquí. Tenemos cadena, no dividida. Entonces de nuevo, un mapa es un bucle. Entonces esto ya va a ser oh de a ya que nos estamos moviendo sobre la matriz y luego lo que hagamos aquí dentro se va a multiplicar por eso porque está dentro del bucle. Por lo que ordenar una sola cadena va a ser s veces Log of s a sort La operación generalmente se
toma como n veces larga de fin y aquí va a ser la longitud de nuestra cadena. Unirse de nuevo a ellos va a ser Va a ser Oh, de S que es la longitud de la cuerda otra vez Así que en realidad podemos sumar estos juntos. Tan split creo que me olvidé por completo la parte dividida Eso también va a ser solo s so s para dividir s veces Log de s para clasificar y s otra vez para unirme como plus s long else plus s Y en realidad podemos simplificar eso y a tiempos a s plus términos Log of esto y todo este término en realidad puede desaparecer porque s veces log de s es de orden más alto que sí. Ya que estas dos son variables diferentes y nosotros, tenemos que quedarnos con las dos. Esto rinde a veces s veces log de s para nuestro tiempo, complejidad. ¿ Y qué pasa con el espacio? Bueno, almacenamos toda una matriz de artículos y esa matriz va a tener la misma longitud que nuestra Valerie
inicial. Entonces eso va a ser oh, de una longitud de la matriz. Y cada una de esas cuerdas en realidad va a tener la misma longitud que las cuerdas originales. Entonces va a ser un momento. Es s porque estamos almacenando las mismas cadenas nupciales, luego las cadenas. Vamos a ser el mismo enlace. Entonces ese es nuestro tiempo en complejidades espaciales para la solución. En el siguiente video, repasaremos otra solución y trataremos de mejorar un poco estos dos. Nos vemos ahí.
9. Procesamiento de anagramas rápido: bienvenidos de nuevo a todos los anagramas. En el último video, escribimos una solución que en una especie, cada una de las cadenas y luego determinar si las cadenas eran todas iguales entre sí. Aquí, vamos a trabajar un poco en nuestra solución y derribar esas
complejidades de tiempo y espacio que parecían un poco difíciles de manejar en el último video. Entonces en lugar de ordenar, vamos a probar otra estrategia, y esa estrategia va a estar contando las ocurrencias de cada personaje individual. Entonces, por ejemplo, tomando la Serie vamos a querer crear un objeto que nos diga cuántos de cada personaje hay en esta cadena. Vamos a querer hacer lo mismo para la siguiente cadena y asegurarnos de que esos dos objetos sean iguales o que tengan exactamente el mismo aspecto y hagan lo mismo para esta tercera cuerda y de una y otra vez. Y sólo tenemos que asegurarnos de que esos objetos haciendo un seguimiento de nuestros personajes se vean exactamente iguales para todas y cada una de las cadenas de la matriz fueron dadas. Adelante y empecemos. Entonces vamos a necesitar un lupas de siempre. ¿ Y qué queremos hacer aquí? Bueno, queremos crear un objeto con los conteos de caracteres de la cadena. ¿ Y cómo hacemos eso? Bueno, y lo hemos hecho un par de veces antes cuando necesitamos dio empezar por crear un objeto y luego actuaremos. Vas a necesitar otro bucle. Este bucle se va a ver así. - Tan bastante sencillo. Esto lo hemos hecho varias veces hasta ahora. Esto es sólo un bucle que va a llenar este objeto con los conteos de caracteres de cualquier cadena que pasemos. Si es la primera vez que estamos procesando al personaje, entonces aún no va a estar en nuestro objeto. Y cuando lo
busquemos, nos vamos a quedar indefinidos. Entonces queríamos establecer su valor en uno. Si ya tiene un número significando que ya existe en nuestro objeto. Nosotros sólo queremos aumentar ese número en uno. Podemos limpiar un poco esto solo para que sea más fácil de leer. Y solo para asegurarnos de que hicimos esto bien, vamos a cónsul objeto log. Entonces ejecutándolo con solo estas tres cuerdas y eso parece que está funcionando exactamente de la manera que queremos bueno saber. Entonces tenemos este objeto y ¿qué queremos hacer con él? Bueno, queremos compararlo con otro objeto para otra cadena. ¿ Y cómo obtenemos ese objeto? Bueno, debilita, solo haz eso antes del bucle de cuatro. Entonces aquí en nuestro bucle, realidad
podemos empezar con el elemento uno, lo que significa que comenzaremos con esta cadena. Y antes de que realmente iniciemos el bucle, podemos seguir adelante y crear el objeto para esta primera cadena. Entonces, esencialmente, queremos crear un objeto para la primera cadena. Y eso en realidad va a seguir solo toda esta lógica excepto en lugar de así en lugar de la cadena esto va a ser cadenas es cero. No, Lo que tenemos aquí es que tenemos esencialmente el mismo código escrito dos veces. Algo bueno que hacer sería extraer esto en otra función para que podamos seguir adelante y hacer eso. Nos ayudará a salir y limpiarlo un poco por cotización. - Y eso debería funcionar para que podamos seguir adelante y deshacernos de éstos y simplemente usar nuestra nueva función. No puedo deshacerme de todo esto y función de usuario otra vez. No, estamos comparando. El objeto generaría aquí con el objeto generado aparece el cual va a ser para la primera cadena. Tenemos que asegurarnos de que cada propiedad en esos objetos sea equivalente. Y en realidad necesitamos hacer eso con otro bucle. - Casi ahí. Ahora bien, esto debería funcionar. Adelante. Y estamos en ello solo para asegurarnos de que salgamos de verdad. Probemos que éste se caiga verdadero y falso. Esto parece que funciona. Por lo que hemos visto que nuestra función funciona para estos cuatro. Pero permítanme mostrarles un ejemplo donde nuestra función realmente devuelve el resultado equivocado. Entonces si tuviéramos una rodilla aquí y la ejecutamos, necesito un comentario estos fuera. Esperamos caídas porque esto tiene una e extra que significa que estos tres no son anagramas, pero volvemos verdad. Y esto es porque lo que estamos haciendo aquí es que primero estamos creando un objeto para el primer personaje. Cuenta la primera cuerda que obtenemos. Disculpe. Entonces ese objeto va a verse así. Tiene un a través de e y cada uno tiene uno. Eso es lo que queremos ahora aquí. Como puedes ver, nos falta el por lo que tenemos la e en la primera cuerda, pero no en la 2ª 2 cuerdas, y podemos ver eso todo aquí. Ahora, el problema está en este bucle, todo lo que estamos haciendo es retornadores verificando los personajes que vemos en estos dos objetos. Entonces estamos revisando para ver si un en pelos igual dedo del pie uno y es B es igual a uno. C es igual a uno, y D es igual a uno. No revisamos para asegurarnos de que no haya extras. Entonces esto realmente pasa son chequear uno que no debería. Y hay algunas cosas que podemos hacer para evitar eso. Lo que vamos a hacer es probablemente uno de los más fáciles y uno de los menos
intensivos de tiempo . Entonces solo vamos a seguir adelante y hacer eso. Y lo que queremos hacer es crear otro bucle para pasar por la cuerda. Perdón. Pasa por la matriz y solo asegúrate de que todas las cuerdas tengan la misma longitud. Sencillamente, empezamos en una y vamos hacia el final y solo asegurarnos de que todo artículo longitudes Así que de nuevo , sabemos esperamos que esto devuelva falso, y sí recuperamos falso. Por lo que arreglamos nuestro código. Esto es todo. Esta es toda nuestra función. Vamos a pasar por las complejidades del tiempo y el espacio. Por lo que por el tiempo comenzaría con la parte superior en vivo que tenemos aquí. Tenemos mucho a Estamos recorriendo toda la matriz y asegurándonos de que las cadenas tengan la misma longitud. Entonces eso es solo un bucle a través de la matriz aquí abajo. Averigamos la complejidad del tiempo. Olvida el conteo de autos. Estamos pasando por un bucle y procesando cada personaje de la cadena. Entonces va a haber un bucle estándar que tome un enlace que toma un tiempo proporcional a la longitud de la cadena. Entonces va a haber Oh, de s, eso significa que todo esto es Oh, de s, esto de aquí va a ser más de un ya que es un bucle sobre toda la matriz y luego esto y aquí va a ser sobre s así esto se convierte en de un tiempo s Este de aquí también es de s Así es o de ocho veces dos s, pero la constante se cae. Entonces solo conseguimos un de s. y esa es nuestra última hora. Complejidad para el espacio. No, importa lo grandes que sean las cuerdas A es Todo lo que hacemos es crear solo unas pocas variables que creamos. Yo creamos primer consejo automovilístico. Este es un objeto. Déjame deshacerme de estos. Es para que no nos confunda. Entonces aquí yo Todo este bucle sólo va a declarar uno muy yo Así podemos ignorar que Este aquí
mismo va a ser Oh, de s porque tenemos un objeto lleno de los conteos de caracteres de una cadena y ese
tamaño de objeto va a ser proporcional a la longitud de esa cadena. Entonces va a haber un Nove s aquí dentro. Podemos crear una variable I, que ha sido significativa. Y aquí creamos otra variable, Oh, de la cual también va a ser más de s. Es un objeto que es proporcional en tamaño a la longitud de esta cadena. Entonces y en este bucle de cuatro, no
hacemos nada,
uh, uh, con el espacio. Realmente no creamos ningún objeto aquí ni ninguna variable en absoluto. Entonces tenemos un no de s y otro o de s. y éstos se van a sumar juntos porque esto se queda para la longitud de la función para la longitud de la función restante. Y este objeto aquí se genera cuando iniciamos el bucle y luego se elimina una vez que
termina el bucle . Por lo que este bucle Onley engendra uno de estos objetos a la vez, por lo que a lo sumo a la vez, estaban usando O de s plus s espacio, lo que nos da fuera a s, lo que simplifica hasta O de s. Y esa es la final complejidad espacial para esta función. Viendo la siguiente lección.
10. Rotación de una matriz cuadrada: problema. Rotate, matrix, matrix y script Java se pueden representar como una matriz de un raise. Y aquí hay un ejemplo. Tenemos una sola matriz externa que se denota por este corchete en este corchete aquí y aquí dentro. Tenemos tres matrices, cada una con tres elementos en ellas, y esto constituye una matriz tres por tres. Nuestro objetivo aquí es escribir una función que tome esta entrada. Por lo que la entrada va a ser este array de arrays y da salida a una nueva matriz. Por lo que queremos que la función devuelva un array de un raise y esa nueva matriz que se devuelva debe ser la misma que ésta giró 90 grados. Esto debería funcionar tanto para matrices cuadradas como rectangulares. Entonces básicamente, mayores ve de cualquier dimensión para el ejemplo dada esta matriz como entrada y podemos ignorar estos thes índices de aire solo dedo del pie para ver dónde se encuentran estos números. Dada esta matriz como entrada con esta matriz de tres matrices, queremos que nuestra función dé salida a Esta matriz. Como puedes ver, todo se gira sólo 90 grados en el sentido de las agujas del reloj. El uno se mueve a la derecha, tres bajan, el nueve va a la izquierda y el siete sube y todo lo demás se mueve con los cuatro. Perdón, los dos se mueve hacia la derecha y hacia abajo los seis se mueve hacia abajo e izquierda y sigue y sigue. Por lo que esencialmente necesitamos rotar esta matriz 90 grados en el sentido de las agujas del reloj. Adelante y prueba la ensalada por tu cuenta. Es bastante divertido, y no es terriblemente difícil, pero vuelve cuando estés listo. Cuando hayas probado el problema, sigamos adelante y empecemos a resolverlo. Por lo que el problema establece que la Matrix original debe permanecer sin cambios. Y lo que esto significa es que queremos crear una nueva matriz para regresar. No queremos simplemente mover las cosas en el original, sino que queremos hacer una nueva. Entonces vamos a crear eso. Entonces sólo vamos a empezar con una matriz y ¿cómo llenamos esta matriz? Bueno, solo
empecemos con una matriz cuadrada por ahora. Entonces examinemos este tres por tres que ya tenemos. Entonces si tenemos un tres por tres es entrada. Sabemos que nuestras salidas también van a ser un tres por tres. Si tenemos un cuatro por cuatro. ¿ Serán las salidas un cuatro por cuatro. Entonces el número de un aumento aquí y nuestra nueva matriz va a ser el mismo que el número de un aumento en la vieja Matrix. Y podemos descifrar que usando la propiedad length, esta matriz externa tiene una longitud de tres porque tiene tres elementos dentro de ella. Entonces podemos usar eso para simplemente crear el mismo número de filas para esta nueva matriz. Y esa es nuestra nueva Matrix tendrá el número correcto de una carrera en ella. Y asegurémonos de que estamos haciendo esto bien a medida que avanzamos y vamos a poner un ejemplo. Ve y roba esto. Está bien, ahí. Por lo que tenemos una matriz de tres carreras como se pretendía. Ahora también sabemos al final que necesitamos devolver esto para que sólo podamos escribir esa declaración. Y ahora, Ahora ¿qué hacemos en medio? Sólo tenemos que llenar The Matrix con los números correctos, y vamos a hacer eso buceando a través de The Matrix fueron dados. Entonces estamos dando un bucle por aquí y en realidad vamos a tener que bucear dentro de cada
prisa interior . Entonces ahora mismo estamos buceando a través de esta matriz externa y el rol actual ¿dónde va a ser éste? Y luego los bucles van a pasar a éste. Y en este, tenemos que mirar también a través de cada uno de estos para llegar a estos números de forma individual. Aquí estamos usando la longitud de punto cero mate. En realidad, esto sólo se puede cambiar a las matemáticas que vinculan. Eso es lo mismo, porque en este momento sólo estamos enfocados en matrices cuadradas, y el número de artículos aquí dentro va a ser el mismo que el número total de un aumento. Entonces esto va a funcionar para nosotros simplemente bien. Y ahora, por lo difícil, tenemos que realmente averiguar cómo mover estos artículos al lugar correcto.
11. Rotación de una solución de Matrix cuadrada: Bienvenido de nuevo. Sigamos trabajando en este problema. Por el momento, tenemos la base puesta, y ahora sólo necesitamos un algoritmo para mover realmente estas piezas al lugar correcto. Y sigamos adelante y trabajemos en eso y por ejemplos. Por ejemplo, empecemos con una simple matriz de dos por dos, así que solo voy a seguir adelante y usar una también. Esto necesita otro soporte y 34 y esto necesita convertirse en 31 cuatro a, y eso es una rotación de 90 grados. Entonces, sigamos adelante y mapeemos los cambios de posición reales que suceden. ¿ Y a qué te refieres con eso? Es esto así que uno aquí está en la posición 00 Está en fila en Índice cero en esa fila. Está en la columna cero por lo que podemos decir 00 se mueve a todavía en rosa cero. Entonces eso se mantiene igual, y se conoce Columna uno. Entonces eso se va a pasar al 01 Y hagamos esto también para los otros tres. Entonces obtenemos un artículo al 01 se mueve al 11 y obtenemos un artículo a las 10 ¿Pasando a donde pasa? Mueve 200 y obtenemos 11 moviéndose a 10 Y eso parece bien. Entonces a partir de aquí, en realidad
podemos seguir adelante y crear un algoritmo. Si hacemos esto para tres por tres o cuatro por cuatro, o cualquier matriz cuadrada, vamos a obtener los mismos resultados. Y esos resultados se van a regir por una simple regla matemática, que va a ser ésta. Perdóname por el tipo de vidas y solo para asegurarme de que estamos haciendo esto bien, voy a alargar esto. Entonces 741 852 963 Eso es exactamente lo que queremos. Y vamos a mostrarte cómo esto realmente está funcionando. Vamos a enchufar algunos números. Por lo que enchufando 00 aquí en esto en el lado derecho, obtenemos Nueva matriz, por lo que Jay está posicionado. Cero. Entonces eso son días. Agrega cero. Entonces eso es correcto. El primer elemento va a ser cero, y el segundo elemento va a ser de longitud de punto mate. Entonces la longitud de esta matriz es, uh, longitud dos. Hay tres artículos, pero su longitud a tan dos menos uno es uno menos I, que es cero ya que estamos empezando a las 00 Así que 00 enchufados aquí lleva 20 coma uno en el lado
izquierdo. Por lo que en realidad hemos cumplido 00 y 201 Hemos movido el artículo de 00 a 01 Podemos hacer esto por el resto de ellos. Podemos enchufar 11 aquí, y lo que obtenemos es uno en la posición de la mano izquierda y Matt en longitud a menos uno menos uno . Aquí tenemos cero, así que hemos cumplido 11 en 210 Adelante y enchufa estos dos. O prueba lo que quieras. Funcionará cada vez que hayamos resuelto este problema para matrices cuadradas y en la siguiente lección se adelantará e intentará aplicar esto a todo maitresse. Facilidad. Ver ahí.
12. Rotar la matriz: dos problemas de bonificación: bienvenido de nuevo en la última lección. Efectivamente terminamos este problema. Pero quiero seguir adelante y darles un poco de aguinaldo. Por lo que el primer problema de aguinaldo va a estar bien. Una función que todos los rotadores matrices 180 grados. Y el siguiente tendrá razón. Uno que lo rota 270 grados. También se podría pensar en este como negativo 90. Ya tenemos éste. Acabo de colapsar. Teoh, haz espacio para los demás. Esta es exactamente la misma función que teníamos antes y nada es diferente. Yo sólo lo estoy colapsando. Y estos son resultados esperados para esta matriz. Por lo que giró 90. Queremos este 1 80 ¿Quieres esos 2 70? Nosotros queremos esto. Todo lo que tenemos que hacer es escribir estas dos funciones. Hay algunas formas diferentes de hacerlas. Adelante y prueba si quieres. Si quieres seguir adelante y solo ver el video, puedes hacerlo también. Ya que esto es sólo un bono, dejaré que se deslice. Entonces así es como voy a resolver este problema. Y eso es un hecho. Y eso también está hecho y está asegurándose de que estos alineen durante el 14 al 4321 2413 Y estamos bien. ¿ Crees que esto es hacer trampa? Yo
también lo hago . Pero el punto
es, realmente no importa. Estas funciones funcionan, y funcionan perfectamente bien. Y en realidad hay razones por las que preferirías estas sobre otra gran función como esta. Tu recurso más valioso como desarrollador es tu propio tiempo. No es la cantidad de tiempo que la máquina tarda en ejecutar tu código. Estos resultados son abrumadores rápidamente. Yo había corrido y antes puedo pensar que los resultados están ahí, y eso va a pasar para casi todas las funciones que escribas en toda tu carrera. Computadoras aire rápido Las personas son lentas, por lo que quieres pasar tu tiempo escribiendo el menor código posible. Hemos escrito una función que funciona perfectamente, y sabemos que funciona. Lo hemos probado un poco. ¿ Por qué no reutilizarla? Si
podemos, sólo lo reutilizamos. Lo llamamos dos veces, y gira nuestra función 1 80 grados. Lo llamamos una vez más, y lo hará 270 grados en lugar de escribir el mismo esencialmente el mismo código con
algunas diferencias nuevamente y potencialmente introduciendo bugs. Cuando tratamos de hacer eso, podemos usar la única función que conocemos, funciona y ahorrar una tonelada de tiempo haciendo esto de la manera fácil en lugar de la forma difícil, las complejidades de tiempo de estas funciones van a ser las mismas que las originales. Entonces, ¿recuerdas este waas por el tiempo? Ah, de n y éste va a ser Sólo lo estamos haciendo dos veces. Entonces dos veces adentro y bajamos constante, así que va a estar adentro. De todos modos, éste iba a estar tres veces adentro, que de nuevo se va a convertir en oh, entonces el espacio va a ser lo mismo. Entonces la complejidad del espacio para éste había terminado entonces, porque donde crear una matriz completamente nueva con los mismos ítems aquí, va a ser también de en otra vez. Nos multiplicaron por dos. Ya que la función se llama dos veces, tenemos dos de estos y memoria a la vez, y la complejidad del espacio también va a terminar siendo de lo mismo para éste. Eso es todo. Espero que eso haya sido divertido. Y te veré en el siguiente video donde realmente aprendemos a rotar una matriz en su lugar . Y lo que eso significa es que no podemos crear ningún raise ni ninguna estructura de datos adicional en nuestra función. Es un problema mucho más difícil, y vamos a tener que reescribir todo, así que te veré ahí.
13. Rotación de Matrix estrategia: bienvenidos al siguiente problema. Rotar matriz en su lugar. Es lo mismo exacto es el último problema. Excepto en este caso, sabemos que siempre vamos a conseguir una matriz cuadrada, es
decir, un tres por 3555 10 por 10 lo que sea. Y nuestro objetivo es rotarlo 90 grados en el sentido de las agujas del reloj. Pero esta vez necesitamos hacerlo en su lugar. Y la clave de lo que significa en su lugar es que no se puede crear ninguna matrices extra ni un aumento en su función o cualquier otra estructura de datos. De verdad. Todo lo que puedes almacenar son variables. Adelante y prueba esto por tu cuenta si quieres. Te voy a advertir. Éste es muy difícil. E incluso una vez que averiguas cómo hacerlo, el código es muy difícil de escribir. Entonces voy a resolver esto en dos problemas. Primero pasaremos y discutiremos la estrategia que vamos a emplear, y luego te mostraremos algún código. Por lo que tengo aquí un pequeño bloc de boceto. Ups. Y tomemos esta matriz como insumo y solo discutamos la estrategia que vamos a utilizar. Entonces aquí tenemos una matriz de cinco por cinco y sólo vamos a usar esto como ejemplo. Ahora voy a seguir adelante y sacar el esencialmente el perímetro de la Matrix. Entonces vamos a fingir que el interior ni siquiera existe. Todo lo que nos importa son las filas y columnas exteriores de Thea. Y lo que queremos dio es esto. Queremos tomar el número de la mano superior izquierda y moverlo por aquí. Por lo que queremos sacar esto aquí. Pero antes de hacer eso, tenemos que averiguar qué hacer con este número. No podemos simplemente anularlo porque este número necesita moverse aquí abajo y éste necesita
ir por aquí. Y por último, éste necesita ir por aquí para completar nuestro pequeño círculo. Entonces para cuando hemos hecho esto se ha movido aquí,
Fives se mudó aquí, 20 cincos aquí y 20 aquí arriba. Hemos hecho una rotación completa de 90 grados de las esquinas, por lo que estas esquinas se han girado completamente. Ahora lo que vamos a querer hacer es seguir adelante. Entonces empieza aquí y vamos a necesitar mover a este tipo por aquí y el 10 se va
a mover al puesto de 24. El 24 va a ir al 16 y el 16 va a sustituir de donde salieron los dos originalmente. Entonces ahora nos adelantamos, y hemos rotado 2/5 de todo este perímetro exterior, y en realidad necesitamos la mitad de él. Perdón, porque sólo nos importa cuando necesita hacer esto cuatro veces. Entonces cuando lo hagas por las esquinas y luego este ítem en este ítem y luego los cuatro por aquí, ya
hemos hecho los cinco que ya se cuidaron. Entonces sólo necesitábamos a esto cuatro veces. Esto es lo que vamos a necesitar codificar una vez que seamos capaces de replicar esto y no volveré a dibujar las flechas porque eso sólo hará que esto sea innecesariamente confuso. Pero una vez que nos imaginamos una vez que
hemos hecho esto, entonces podemos pasar a la siguiente fila. No somos la siguiente fila. Perdón. Siguiente perímetro. Entonces voy a seguir adelante y agarrar esto de aquí, e intentaré moverlo un poco más abajo y volver al lápiz. Entonces una vez que hayamos terminado con el perímetro exterior, lo que
significa que está totalmente girado podemos pasar al siguiente perímetro interior, y solo queremos hacer exactamente lo mismo. Mueve a este tipo justo aquí. Mueve a este tipo aquí y sigue y sigue. Y una vez que
podamos hacer eso, podemos pasar al siguiente. En este caso, ya que sólo teníamos un 555 el último perímetro será el número 13 por sí mismo. Y podemos dejar eso, como es así realmente necesitamos sólo hacer esto dos veces. En este caso, si es de siete por siete tendrá que hacerlo una vez más si es un nueve por nueve y luego otra vez. Pero esta es la estrategia que necesitamos codificar. Adelante y pruébalo por tu cuenta. Y en la siguiente lección, te
mostraremos la solución y te mostraremos cómo funciona.
14. Rotación en la Matrix solución: bienvenida de nuevo para rotar matriz en su lugar. En lugar de resolver este problema. En vivo como lo hemos estado haciendo durante el pasado varios problemas, pensé que sería mejor sólo mostrar la solución y hablar de ello. Este problema es quizás el problema más desafiante técnicamente en todo este curso. Entonces, en lugar de caer sobre mi abrigo, mi código como fumble tratando de explicártelo, pensé que sería más fácil simplemente escribirlo y explicarlo después solo para
asegurarme de que funciona. Adelante y corrámoslo. Entonces para esta matriz aquí mismo, esperamos esto como salida. Y si hubiera corrido una vez más, obtenemos justo lo mismo y es exactamente lo que esperamos, cual es bueno. Vamos a mostrarte el código y hablar de lo que cada línea está haciendo. Por lo que mentir 21 Esto es variable. Capas totales va a contener un número que nos dice cuántas capas necesitamos pasar . Y lo que quiero decir con una capa es cada una de estas. Entonces esta aquí mismo este perímetro es una capa por la que queremos pasar. Queremos rotar cada elemento de este perímetro y luego pasar a la siguiente capa, que será este círculo interno justo aquí. Entonces si tenemos una matriz que es un cinco por cinco. Sólo necesitamos pasar por dos capas. Y esta fórmula aquí mismo nos dirá que interna for loop, vamos de cero al número de capas, como acabamos de mencionar. Y eso tiene sentido. Y esta línea aquí mismo está determinando la condición stop para nuestro bucle interno for. Y la forma en que funciona es que vamos a empezar en capa más uno. Entonces lo que eso significa es que estamos empezando. Entonces, ¿cuándo empezamos con esta Matrix capas esencialmente se va inicialmente a igual cero. Entonces estamos diciendo que queremos empezar en el índice uno, Lo
que significa en el 02 justo aquí la condición stop, que va a ser de longitud de punto mate menos capa, significa que queremos parar a cinco menos cero. Por lo que queremos parar aquí mismo. Entonces cuando pasamos por este ejercicio, iniciamos a la 01 y terminamos Oh, para nuestro bucle es en cambio empezar a las 02 y terminar a las 05 que funcionará igual. Entonces movimos los dos a las decenas, colocamos ese 10 a 24 24 a 16 y 16 a 2, y luego pasamos a los tres y rotamos y luego el cuarto y luego último de todo hacemos las esquinas. Este código aquí está haciendo todo el levantamiento pesado. Entonces cuando estamos moviendo los dos hacia el 10 vamos a necesitar almacenar el 10 en una variable antes de poder reemplazarlo por dos. Si sólo lo anulamos, entonces perdemos 10. Por lo que necesitamos almacenar esto y luego actualizar su valor. Entonces necesitamos almacenar el 24 justo aquí, y necesitamos reemplazarlo por el 10. Entonces en realidad vamos a necesitar dos variables diferentes. Tempel uno e intento de temp uno va a estar almacenando el 10 inicialmente y temperamento a va a estar almacenando 24 girará su uso Así que el 10 se va a mover aquí, y vamos a golpear esto en una variable. Entonces 24 se va a pasar a 16 que vamos a almacenar en una variable y luego 16 se va a trasladar a donde es feliz. Es probable que necesites pasar por una rotación de matriz a mano para observar cómo funciona esto. Realizar un seguimiento de cada una de las variables y realizar un seguimiento de lo que está sucediendo literalmente. Intenta dibujar una matriz en un pedazo de papel y pasa por este código. Una vez que cada uno de estos se intercambia y se gira toda la capa, este bucle interno se va a terminar, y este bucle externo se va a incrementar. Entonces vamos a pasar a esta capa, y vamos a hacer exactamente lo mismo. Por lo que nuestro bucle va a empezar en el ocho y terminar en el nueve que va a girar la A para moverlo al 14 mover el 14 en adelante y en adelante y en adelante, y luego va a hacer las esquinas después de eso. Entonces va a mover el nueve al 19 y seguir y seguir y seguir al final. Acabamos de devolver la misma matriz exacta que nos dieron. cuales sean bien las complejidades del tiempo y el espacio, solo procesamos cada elemento una vez que rotamos una capa, y luego pasamos a la siguiente capa, la complejidad del tiempo va a estar fuera del espacio. Complejidad. Bueno, aquí no
estamos creando una sola estructura de datos. Todo lo que estamos haciendo es usar variables. No importa lo grande que sea la Matrix. Utilizamos el mismo número de variables, así que eso va a pasar a O de una. Este es áspero. Si se
te pregunta en una entrevista, lo más probable es que te pidan que solo des la estrategia general que utilizarías y quizá
hables un poco de la eficiencia. Hacerlo correcto podría tomar un buen programador horas, lo que sería demasiado largo para una entrevista. Este problema es genial al hacernos pensar en cómo transformar espacialmente los datos. La capacidad de entender la solución muestra poderosas habilidades de razonamiento y un excelente razonamiento
espacial también. Si esto es demasiado complejo, intenta volver a él en otro momento. Intenta caminar por la función usando una matriz simple como una de dos por dos o tres por tres. Hacer un seguimiento de cada una de las variables y lo que le está pasando a la Matrix. Adelante y pruébalo tú mismo para cualquier matriz cuadrada que te guste. Te veré en el próximo video