Al principio no le entendia porque dice que m tiene la longitud de nums1 y luego sale con que nums1 tiene la longitud de m + n 💀
Ya viendo el ejemplo le entendi xD
¿Cómo combinar dos arrays ordenados en uno solo manteniendo el orden ascendente? Ese es el reto del problema Merge Two Sorted Lists, un ejercicio clásico para practicar manipulación de arrays, complejidad temporal y pensamiento algorítmico antes de escribir una sola línea de código.
¿Qué pide el problema Merge Two Sorted Lists?
El enunciado entrega cuatro entradas y pide devolver un único array ordenado de forma ascendente.
Las entradas son dos listas de enteros, nums1 y nums2, junto con dos enteros, m y n, que representan cuántos elementos válidos hay en cada lista. Ambas listas vienen ya ordenadas de forma independiente, así que tu trabajo es fusionarlas sin romper ese orden [00:23].
¿Qué significa que nums1 tenga longitud m+n? Que el array más grande reserva espacio para todos los elementos finales. Los primeros m valores son reales y los últimos n son ceros que debes ignorar.
¿Por qué nums1 trae ceros al final?
Esa es la parte que suele confundir al leer el problema por primera vez.
Si nums1 tiene cuatro elementos válidos y nums2 tiene tres, nums1 llega con longitud siete: cuatro números reales y tres ceros de relleno. Esos ceros no son datos, son espacio reservado para acomodar los valores de nums2 cuando hagas la fusión [01:00].
Piénsalo como una caja con compartimentos vacíos esperando ser llenados. No tienes que crear un array nuevo, tienes que aprovechar el que ya viene preparado.
¿Cómo abordar la solución antes de programar?
Antes de escribir código, conviene dibujar el flujo y pensar en la complejidad.
Este tipo de problemas premia a quien planea. Si te lanzas a teclear sin diagramar, terminas con bucles anidados innecesarios o estructuras auxiliares que disparan el uso de memoria. La recomendación es clara: primero diagrama, después implementa [01:30].
Después de ese ejercicio, recién ahí abres el editor.
¿Qué es la complejidad temporal y espacial en este reto?
Son las dos métricas con las que se mide la calidad de tu solución.
¿Qué es la complejidad temporal? Mide cuántas operaciones hace tu algoritmo en función del tamaño de la entrada. En este problema, lo ideal es lograr O(m+n).
¿Qué es la complejidad espacial? Mide cuánta memoria adicional necesita tu algoritmo. Si fusionas en el mismo nums1 sin crear listas nuevas, tu costo espacial es O(1).
Lograr ambas métricas óptimas es el objetivo cuando enfrentas un merge de arrays ordenados.
¿Qué entrada de ejemplo recibe el algoritmo?
Un caso típico entrega nums1 con sus valores reales seguidos de ceros, nums2 con sus valores y los enteros m y n indicando los conteos.
La salida esperada es una sola lista con todos los números ordenados de menor a mayor. No hay que devolver índices ni estructuras adicionales, solo el array fusionado [01:15].
El reto está en hacerlo con el menor costo posible de tiempo y memoria. ¿Qué complejidad temporal y espacial alcanzaste tú? Comenta tu enfoque antes de ver la solución en la próxima clase.
¿Cómo combinar dos arrays ordenados en uno solo manteniendo el orden ascendente? Ese es el reto del problema Merge Two Sorted Lists, un ejercicio clásico para practicar manipulación de arrays, complejidad temporal y pensamiento algorítmico antes de escribir una sola línea de código.
El enunciado entrega cuatro entradas y pide devolver un único array ordenado de forma ascendente.
Las entradas son dos listas de enteros, nums1 y nums2, junto con dos enteros, m y n, que representan cuántos elementos válidos hay en cada lista. Ambas listas vienen ya ordenadas de forma independiente, así que tu trabajo es fusionarlas sin romper ese orden [00:23].
¿Qué significa que nums1 tenga longitud m+n? Que el array más grande reserva espacio para todos los elementos finales. Los primeros m valores son reales y los últimos n son ceros que debes ignorar.
Esa es la parte que suele confundir al leer el problema por primera vez.
Si nums1 tiene cuatro elementos válidos y nums2 tiene tres, nums1 llega con longitud siete: cuatro números reales y tres ceros de relleno. Esos ceros no son datos, son espacio reservado para acomodar los valores de nums2 cuando hagas la fusión [01:00].
Piénsalo como una caja con compartimentos vacíos esperando ser llenados. No tienes que crear un array nuevo, tienes que aprovechar el que ya viene preparado.
Antes de escribir código, conviene dibujar el flujo y pensar en la complejidad.
Este tipo de problemas premia a quien planea. Si te lanzas a teclear sin diagramar, terminas con bucles anidados innecesarios o estructuras auxiliares que disparan el uso de memoria. La recomendación es clara: primero diagrama, después implementa [01:30].
Después de ese ejercicio, recién ahí abres el editor.
Son las dos métricas con las que se mide la calidad de tu solución.
¿Qué es la complejidad temporal? Mide cuántas operaciones hace tu algoritmo en función del tamaño de la entrada. En este problema, lo ideal es lograr O(m+n).
¿Qué es la complejidad espacial? Mide cuánta memoria adicional necesita tu algoritmo. Si fusionas en el mismo nums1 sin crear listas nuevas, tu costo espacial es O(1).
Lograr ambas métricas óptimas es el objetivo cuando enfrentas un merge de arrays ordenados.
Un caso típico entrega nums1 con sus valores reales seguidos de ceros, nums2 con sus valores y los enteros m y n indicando los conteos.
La salida esperada es una sola lista con todos los números ordenados de menor a mayor. No hay que devolver índices ni estructuras adicionales, solo el array fusionado [01:15].
El reto está en hacerlo con el menor costo posible de tiempo y memoria. ¿Qué complejidad temporal y espacial alcanzaste tú? Comenta tu enfoque antes de ver la solución en la próxima clase.
Al principio no le entendia porque dice que m tiene la longitud de nums1 y luego sale con que nums1 tiene la longitud de m + n 💀
Ya viendo el ejemplo le entendi xD
Dadas dos listas de números enteros nums1 y nums2, cada una ordenada en orden ascendente, y dos enteros m y n, que representan la cantidad de elementos en nums1 y nums2 respectivamente.
.
Combinar nums1 y nums2 en un único array ordenado de forma ascendente.
.
Para ello, nums1 tienen una longitud de m+n, donde los primeros m elementos denotan los elementos que deben ser combinados, y los últimos n elementos son 0 y deben ser ignorados.
.
Ejemplo
nums1 = [1, 2, 3, 0, 0, 0]
m = 3
nums2 = [2, 5, 6]
n = 3
---> [1, 2, 2, 3, 5, 6]
La complejidad temporal es de O(n) ya que hay un único bucle que hace el recorrido de las listas a combinar teniendo en cuenta 3 variables (donde una sirve para recorrer nums1, otra para recorrer nums2 y otra auxiliar para guardar el elemento de la iteración anterior) que sirven para reorganizar los elementos en la nueva lista.
La complejidad espacial también es O(n) debido a que si la cantidad de datos aumenta, siempre se va a generar un array con el doble de tamaño que "nums2" y además las variables temporales de recorrido siempre van a tener el mismo tamaño reservado en memoria.
Entendi el problema utilizando boligrafo y papel (y un poco de guia de gemini).
En pocas palabras, hay 2 apuntadores (uno en cada array) y 1 apuntador que va iterando cada espacio hasta llegar al final y siempre pregunta cual numero de cada apuntador es mayor que el otro. El que sea mayor se agrega al array 1 y se baja al siguiente numero con el apuntador y el otro apuntador no se modifica en ese paso.
const arr1 = [1, 2, 8, 9, 36367, 0, 0, 0];
const n = 5;
const arr2 = [2, 5, 6, 99999];
const m = 4;
function mergeArrays(n: number, m: number, arr1: number[], arr2: number[]) {
let pointer1 = n - 1;
let pointer2 = m - 1;
let worker = n + m - 1;
while (pointer2 >= 0) {
const highest1 = arr1[pointer1];
const highest2 = arr2[pointer2];
let dragged = 0;
if (pointer1 >= 0 && highest1 > highest2) {
dragged = highest1;
pointer1--;
} else {
dragged = highest2;
pointer2--;
}
arr1[worker] = dragged;
worker--;
}
return [...arr1];
}
const newArray = mergeArrays(n, m, arr1, arr2);
console.log({ newArray });
Les dejo el problema en LeetCode:
Comparto mi solución, segun yo tiene una complejidad espacial de O(n) y una temporar de O(m), desconosco si O(m) se termine considerando O(n)
def combineTwoOrderedList(nums1, nums2, m, n) -> list:
# Initialize my pointers
nums1Pointer = m - 1
nums2Pointer = n - 1
orderedPointer = m + n - 1
# Defining cycle for ordering
while nums2Pointer >= 0:
if nums2[nums2Pointer] >= nums1[nums1Pointer]:
nums1[orderedPointer] = nums2[nums2Pointer]
nums2Pointer -= 1
else:
nums1[orderedPointer] = nums1[nums1Pointer]
nums1Pointer -= 1
orderedPointer -= 1
return nums1
# Params Given
nums1 = [1, 2, 3, 0, 0, 0]
nums2 = [2, 5, 6]
m = 3
n = 3
sortedList = combineTwoOrderedList(nums1, nums2, m, n)
for elemnet in sortedList:
print(elemnet)
def sort_numbers(nums1, nums2):
idx_1 = idx_2 = 0; ans = []
while idx_1<len(nums1) and idx_2<len(nums2):
if nums1[idx_1] < nums2[idx_2]:
ans.append(nums1[idx_1])
idx_1+=1
else:
ans.append(nums2[idx_2])
idx_2+=1
while idx_1<len(nums1):
ans.append(nums1[idx_1])
idx_1+=1
while idx_2<len(nums2):
ans.append(nums2[idx_2])
idx_2+=1
return ans
#Temporal O(n)
#Espacial O(n)
nums1 = [3,7,9,0,0,0]
nums2 = [5,6,7]
num1 = 6
num2 = 3
nums1 = nums1[:num2]
sort_numbers(nums1, nums2)
Propongo mi solución antes de ver el siguiente vídeo, en TypeScript:
const mergeTwoSortedLists = (nums1: number[], nums2: number[]): number[] => { nums1 = nums1.filter(n => n !== 0)
return (nums1.concat(nums2)).sort((nums1, nums2) => nums1 - nums2)}
Nose si lo hice bien o mal, no se debe a que mi codigo este mal, sino a que entendiera mal el problema, pero al final mi código da el resultado esperado.
Las variables n y m son innecesarias ya que sumas son la longitud de nums1, osea n+m es igual a len(nums1), pero igual puse esas variables en mi código como forma representativa.


Victor Hugo Vázquez Gómez
Miguel Angel Reyes Moreno
Nicolas Alpargatero
Juan Pablo Reina Gutierrez
Henry J. Perez
Carlos Axel Rodriguez Berrelleza
José López Lara
Karla Angelica Doctor Mauricio
Miguel Angel Reyes Moreno
Marcos Mesias
Kengya Moncada
Joan paredes yupanqui
Carlos Raúl Romero Martínez
Al principio no le entendia porque dice que m tiene la longitud de nums1 y luego sale con que nums1 tiene la longitud de m + n 💀
Ya viendo el ejemplo le entendi xD
Un pequeño error de lógica, quizás xD
Overview
Dadas dos listas de números enteros nums1 y nums2, cada una ordenada en orden ascendente, y dos enteros m y n, que representan la cantidad de elementos en nums1 y nums2 respectivamente.
.
Combinar nums1 y nums2 en un único array ordenado de forma ascendente.
.
Para ello, nums1 tienen una longitud de m+n, donde los primeros m elementos denotan los elementos que deben ser combinados, y los últimos n elementos son 0 y deben ser ignorados.
.
Ejemplo
nums1 = [1, 2, 3, 0, 0, 0] m = 3 nums2 = [2, 5, 6] n = 3 ---> [1, 2, 2, 3, 5, 6]
La complejidad temporal es de O(n) ya que hay un único bucle que hace el recorrido de las listas a combinar teniendo en cuenta 3 variables (donde una sirve para recorrer nums1, otra para recorrer nums2 y otra auxiliar para guardar el elemento de la iteración anterior) que sirven para reorganizar los elementos en la nueva lista.
La complejidad espacial también es O(n) debido a que si la cantidad de datos aumenta, siempre se va a generar un array con el doble de tamaño que "nums2" y además las variables temporales de recorrido siempre van a tener el mismo tamaño reservado en memoria.
Entendi el problema utilizando boligrafo y papel (y un poco de guia de gemini).
En pocas palabras, hay 2 apuntadores (uno en cada array) y 1 apuntador que va iterando cada espacio hasta llegar al final y siempre pregunta cual numero de cada apuntador es mayor que el otro. El que sea mayor se agrega al array 1 y se baja al siguiente numero con el apuntador y el otro apuntador no se modifica en ese paso.
const arr1 = [1, 2, 8, 9, 36367, 0, 0, 0]; const n = 5; const arr2 = [2, 5, 6, 99999]; const m = 4; function mergeArrays(n: number, m: number, arr1: number[], arr2: number[]) { let pointer1 = n - 1; let pointer2 = m - 1; let worker = n + m - 1; while (pointer2 >= 0) { const highest1 = arr1[pointer1]; const highest2 = arr2[pointer2]; let dragged = 0; if (pointer1 >= 0 && highest1 > highest2) { dragged = highest1; pointer1--; } else { dragged = highest2; pointer2--; } arr1[worker] = dragged; worker--; } return [...arr1]; } const newArray = mergeArrays(n, m, arr1, arr2); console.log({ newArray });
Les dejo el problema en LeetCode:
Comparto mi solución, segun yo tiene una complejidad espacial de O(n) y una temporar de O(m), desconosco si O(m) se termine considerando O(n)
def combineTwoOrderedList(nums1, nums2, m, n) -> list: # Initialize my pointers nums1Pointer = m - 1 nums2Pointer = n - 1 orderedPointer = m + n - 1 # Defining cycle for ordering while nums2Pointer >= 0: if nums2[nums2Pointer] >= nums1[nums1Pointer]: nums1[orderedPointer] = nums2[nums2Pointer] nums2Pointer -= 1 else: nums1[orderedPointer] = nums1[nums1Pointer] nums1Pointer -= 1 orderedPointer -= 1 return nums1 # Params Given nums1 = [1, 2, 3, 0, 0, 0] nums2 = [2, 5, 6] m = 3 n = 3 sortedList = combineTwoOrderedList(nums1, nums2, m, n) for elemnet in sortedList: print(elemnet)
def sort_numbers(nums1, nums2): idx_1 = idx_2 = 0; ans = [] while idx_1<len(nums1) and idx_2<len(nums2): if nums1[idx_1] < nums2[idx_2]: ans.append(nums1[idx_1]) idx_1+=1 else: ans.append(nums2[idx_2]) idx_2+=1 while idx_1<len(nums1): ans.append(nums1[idx_1]) idx_1+=1 while idx_2<len(nums2): ans.append(nums2[idx_2]) idx_2+=1 return ans #Temporal O(n) #Espacial O(n) nums1 = [3,7,9,0,0,0] nums2 = [5,6,7] num1 = 6 num2 = 3 nums1 = nums1[:num2] sort_numbers(nums1, nums2)
Propongo mi solución antes de ver el siguiente vídeo, en TypeScript:
const mergeTwoSortedLists = (nums1: number[], nums2: number[]): number[] => { nums1 = nums1.filter(n => n !== 0)
return (nums1.concat(nums2)).sort((nums1, nums2) => nums1 - nums2)}
Nose si lo hice bien o mal, no se debe a que mi codigo este mal, sino a que entendiera mal el problema, pero al final mi código da el resultado esperado.
Las variables n y m son innecesarias ya que sumas son la longitud de nums1, osea n+m es igual a len(nums1), pero igual puse esas variables en mi código como forma representativa.
La complejidad es de n+m al ya estar ordenadas, creo saber hacia donde va esto, esto es el principio para algoritmos como el mergue sort