Saltar al contenido principal

Dos Sumas (Two Sum)

Dado un array de enteros y un objetivo, devuelve los índices de los dos números que suman el objetivo. El reto más famoso de entrevistas técnicas.

dict enumerate() complemento O(n) vs O(n²) hashmap

El problema

Escribe una función dos_sumas(nums, objetivo) que, dado un array de enteros nums y un entero objetivo, devuelva los índices de los dos números que suman objetivo.

Puedes asumir que existe exactamente una solución y que no puedes usar el mismo elemento dos veces.

Ejemplos

numsobjetivoresultado
[2, 7, 11, 15]9[0, 1] (2+7=9)
[3, 2, 4]6[1, 2] (2+4=6)
[3, 3]6[0, 1] (3+3=6)

Código inicial

def dos_sumas(nums, objetivo):
    # Tu código aquí
    pass


print(dos_sumas([2, 7, 11, 15], 9))  # [0, 1]
print(dos_sumas([3, 2, 4], 6))       # [1, 2]
print(dos_sumas([3, 3], 6))          # [0, 1]

Concepto clave: solución O(n) con diccionario

La solución ingenua usa dos bucles anidados (O(n²)): para cada número, busca el complemento entre el resto.

La solución óptima usa un diccionario para recordar qué números ya hemos visto:

Para cada número num en posición i:
  complemento = objetivo - num
  ¿Está el complemento en el diccionario? → devuelve [índice_complemento, i]
  Si no → guarda {num: i} en el diccionario

Este enfoque solo recorre la lista una vez: O(n).

Solución ingenua O(n²)

def dos_sumas_lento(nums, objetivo):
    for i in range(len(nums)):
        for j in range(i + 1, len(nums)):
            if nums[i] + nums[j] == objetivo:
                return [i, j]
    return []

Funciona, pero con una lista de 10.000 elementos hace 50 millones de operaciones. La versión con diccionario hace 10.000.

Próximos pasos

  • Resuelve Tres Sumas: encuentra todos los tripletes [a, b, c] tales que a + b + c = 0
  • Modifica dos_sumas para devolver los valores en vez de los índices
  • ¿Qué pasa si puede haber múltiples soluciones? Devuelve todas