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.

  1. 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 como valor -> indice.
  2. En for i, n in enumerate(nums) recorremos una sola vez y, para cada n, calculamos complemento = target - n: el número que necesitaríamos para completar la suma.
  3. 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].
  4. Si no está, visto[n] = i guarda 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.

Conexiones