Creo que es posible. El secreto es que en realidad no tienes que ordenar la lista, solo necesitas crear un recuento de los números que existen. Esto puede contar como "hacer una suposición" desde una perspectiva algorítmica, pero no desde una perspectiva práctica. Sabemos que las entradas están limitadas por un mínimo y un máximo.
Por lo tanto, crear una matriz de elementos 2 bits, 1 par para cada int de INT_MIN a INT_MAX inclusive, establecer todos ellos a 00.
iterar a través de toda la lista de números. Para cada número en la lista, si los 2 bits correspondientes son 00, configúrelos en 01. Si son 01, configúrelos en 10. De lo contrario, ignore. Esto es obviamente O (n).
A continuación, si alguno de los 2 bits está configurado en 10, esa es su respuesta. La distancia mínima es 0 porque la lista contiene un número repetido. De lo contrario, explore la lista y encuentre la distancia mínima. Mucha gente ya ha señalado que hay algoritmos O (n) simples para esto.
Entonces O (n) + O (n) = O (n).
Editar: responder a los comentarios.
Puntos interesantes. Creo que podría lograr los mismos resultados sin hacer ninguna suposición encontrando el mínimo/máximo de la lista primero y usando una matriz dispersa que va desde el mínimo al máximo para contener los datos. Se ocupa de la suposición INT_MIN/MAX, la complejidad del espacio y la complejidad del tiempo de O (m) al escanear el conjunto.
¿podría engañar su camino y buscar los mismos dos enteros, ya que su diferencia sería la mínima? –
@aforloney - Creo que el requisito "sin hacer ninguna suposición sobre los números en la matriz" lo descartaría. –
@aflorloney: depende de su definición de mínimo. (10 - 10)> (2 - 3). – Juliet