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.
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
| nums | objetivo | resultado |
|---|---|---|
[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 quea + b + c = 0 - Modifica
dos_sumaspara devolver los valores en vez de los índices - ¿Qué pasa si puede haber múltiples soluciones? Devuelve todas