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

Diagramas de flujo

Diagrama de flujo (actividad) del ejercicio 01

Diagrama de flujo (grafo) del ejercicio 01

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})")

Ejecútalo en el navegador

▶ Visualízalo paso a paso en Python Tutor — ve cómo cambian las variables línea a línea.

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