Ejercicio 01 — Dado nums y target, devuelve los indices de los dos numeros que suman…
Dificultad: verde · Módulo 09 (Puente a NeetCode)
Enunciado
dado nums y target, devuelve los indices de los dos numeros que suman target
Cómo se resuelve
Two Sum es el ejercicio insignia de las entrevistas: enseña a cambiar tiempo por memoria usando un diccionario para no tener que comparar todos los pares.
- El enfoque ingenuo sería dos bucles anidados probando cada pareja: eso es O(n^2). Aquí evitamos el segundo bucle con
visto = {}, un dict que guarda cada número ya recorrido comovalor -> indice. - En
for i, n in enumerate(nums)recorremos una sola vez y, para cadan, calculamoscomplemento = target - n: el número que necesitaríamos para completar la suma. if complemento in visto:— la clave del patrón. Preguntar si una clave está en un dict es O(1) (tabla hash), no hace falta buscarla recorriendo. Si el complemento ya lo vimos, la pareja está: devolvemos[visto[complemento], i].- Si no está,
visto[n] = iguarda el número actual para futuras búsquedas. Así cada elemento se mira una vez: O(n) tiempo y O(n) espacio.
Trampa habitual: guardar en el dict ANTES de comprobar el complemento. Si lo haces, un caso como nums=[3,3], target=6 funcionaría por suerte, pero con target = 2*n un único elemento podría emparejarse consigo mismo y dar un índice repetido. Comprueba primero, inserta después.
Para practicar — cópialo y complétalo
Pega este esqueleto y completa los TODO. Es la mejor forma de aprender: inténtalo antes de mirar la solución.
# Curso de Python — Modulo 09: Puente a NeetCode
# Ejercicio 01 — PRACTICA (rellena los TODO)
# Enunciado: dado nums y target, devuelve los indices de los dos numeros que suman target
# Dificultad: verde
# Ejecutar: python3 ej01_practica.py
# PISTA: usa un dict para recordar cada numero y el indice donde lo viste.
# En cada iteracion calcula el complemento y pregunta si ya esta en el dict.
def two_sum(nums: list, target: int) -> list:
"""Devuelve [i, j] tales que nums[i] + nums[j] == target."""
# TODO 1: crea un dict vacio llamado 'visto' (valor -> indice)
visto = {} # TODO: inicializalo correctamente (pista: dict vacio = {})
# TODO 2: recorre nums con enumerate para tener indice i y valor n
for i, n in enumerate(nums): # <-- deja esto como esta
# TODO 3: calcula el complemento que necesitas encontrar
complemento = None # TODO: reemplaza None por target - n
# TODO 4: comprueba si el complemento ya esta en 'visto'
if False: # TODO: reemplaza False por la condicion correcta
# TODO 5: devuelve la lista con los dos indices
return [] # TODO: devuelve los dos indices correctos
# TODO 6: guarda n en 'visto' con su indice i
pass # TODO: visto[n] = i
return []
# --- Pruebas (no toques esta parte) ---
if __name__ == "__main__":
casos = [
([2, 7, 11, 15], 9, [0, 1]),
([3, 2, 4], 6, [1, 2]),
([3, 3], 6, [0, 1]),
]
for nums, target, esperado in casos:
resultado = two_sum(nums, target)
estado = "OK" if resultado == esperado else "FALLO"
print(f"[{estado}] two_sum({nums}, {target}) = {resultado} (esperado {esperado})")Solución — cópiala y ejecútala
# Curso de Python — Modulo 09: Puente a NeetCode
# Ejercicio 01 — MODELO (resuelto)
# Enunciado: dado nums y target, devuelve los indices de los dos numeros que suman target
# Dificultad: verde
# Ejecutar: python3 ej01_modelo.py
# PATRON: dict como memoria de lo ya visto.
# Para cada numero n, calcula su complemento (target - n).
# Si el complemento ya esta en el dict, hemos encontrado la pareja.
# Si no, guarda n -> indice en el dict y sigue.
# Coste: O(n) tiempo, O(n) espacio.
def two_sum(nums: list, target: int) -> list:
"""Devuelve [i, j] tales que nums[i] + nums[j] == target."""
visto = {} # valor -> indice donde lo vimos
for i, n in enumerate(nums):
complemento = target - n
if complemento in visto:
# Encontramos la pareja
return [visto[complemento], i]
# Guardamos el numero actual para busquedas futuras
visto[n] = i
# El enunciado garantiza que siempre hay solucion,
# pero devolvemos lista vacia como salvaguarda.
return []
# --- Pruebas manuales ---
if __name__ == "__main__":
casos = [
([2, 7, 11, 15], 9, [0, 1]),
([3, 2, 4], 6, [1, 2]),
([3, 3], 6, [0, 1]),
]
for nums, target, esperado in casos:
resultado = two_sum(nums, target)
estado = "OK" if resultado == esperado else "FALLO"
print(f"[{estado}] two_sum({nums}, {target}) = {resultado} (esperado {esperado})")Cómo usarlo
Pega el código en un fichero y ejecútalo con tu toolchain habitual (o el botón de Ejecutar de tu editor). Antes de mirar la solución, intenta completar tú el esqueleto: es la mejor forma de aprender.