Repasemos el problema: estamos para encontrar dos elementos, tales como abs(x-y) <= c
, donde c
es una constante, que podemos encontrar en O(n)
time. (De hecho, podemos calcular tanto max(A)
como min(A)
en tiempo lineal y solo asignar c=(max-min)/n
).
Imaginemos que tenemos un conjunto de cubos, de modo que en unos primeros elementos de cubo 0<=x<c
se colocan, en los segundos elementos de cubo c<=x<=2c
se colocan, etc. Para cada elemento, podemos determinar su cubo para O(1)
tiempo. Tenga en cuenta que la cantidad de cubos ocupados no será mayor que la cantidad de elementos en el conjunto.
Vamos a iterar la matriz y colocar cada elemento en su cubo. Si en el cubo lo vamos a colocar, ya hay otro elemento, entonces, acabamos de encontrar el par correcto de x
y y
!
Si hemos repetido todo el conjunto y cada elemento ha caído en su propio cubo, ¡no se preocupe! Iterar los cubos ahora (no hay más de n
cubos, como hemos dicho anteriormente) y para cada elemento de cubeta x
, si en el cubo siguiente y
elemento es tal que abs(x-y)<=c
, entonces hemos encontrado la solución.
Si repetimos todos los intervalos y no encontramos los elementos adecuados, no hay solución.
Dios mío, realmente extrañé esas cosas de encasillamiento (ver the other answer).
Los cubos pueden implementarse como un mapa hash, donde cada cubo contiene un índice de matriz (el elemento de colocación en el cubo se verá así: buckets[ a[i]/c] = i
). Calculamos c
en O(n)
vez, asignamos elementos a los segmentos en O(n)*O(1)
el tiempo (O(1)
es el acceso al mapa hash), recorre los segmentos en el tiempo O(n)
. Por lo tanto, todo el algoritmo es lineal.
Interesante y muy diferente a la mayoría de las preguntas sobre tareas aquí. Aunque tampoco se me ocurre una idea :-( – Joey
¿Hay duplicados en la matriz, y los valores son escasos o densos? –