Dada una std::vector
de elementos distintos clasifican en orden ascendente, quiero desarrollar un algoritmo que determina si hay dos elementos de la colección cuya suma es un cierto valor, sum
.
He intentado dos enfoques diferentes con sus respectivas compensaciones:
Puedo escanear todo el vector y, para cada elemento del vector, aplicar la búsqueda binaria (
std::lower_bound
) en el vector para buscar un elemento correspondiente a la diferencia entresum
y el elemento actual. Esta es una solución de tiempo O (n log n) que no requiere espacio adicional.Puedo atravesar todo el vector y llenar un
std::unordered_set
. Luego, escaneo el vector y, para cada elemento, buscostd::unordered_set
la diferencia entresum
y el elemento actual. Dado que la búsqueda en una tabla hash se ejecuta en tiempo constante en promedio, esta solución se ejecuta en tiempo lineal. Sin embargo, esta solución requiere espacio lineal adicional debido a lastd::unordered_set
estructura de datos.
Sin embargo, estoy buscando una solución que se ejecute en tiempo lineal y no requiera espacio lineal adicional. ¿Algunas ideas? Parece que me veo obligado a cambiar la velocidad por el espacio.