Si los números enteros son 0 a n, puede moverse a través de la matriz, colocando números por sus índices. Cada vez que reemplazas un número, toma el valor que solía estar allí y muévelo a donde debería estar. Por ejemplo, supongamos que tenemos una matriz de tamaño 8:
-----------------
|3|6|3|4|5|1|7|7|
-----------------
S
Donde S es nuestro punto de partida, y vamos a utilizar C para realizar un seguimiento de nuestro índice "actual" a continuación. Comenzamos con el índice 0, y movemos 3 al punto del índice 3, donde 4 es. Ahorre 4 en una var. Temp.
-----------------
|X|6|3|3|5|1|7|7| Saved 4
-----------------
S C
A continuación, poner 4 en el índice 4, el ahorro de lo que solía estar allí, 5.
-----------------
|X|6|3|3|4|1|7|7| Saved 5
-----------------
S C
Sigue
-----------------
|X|6|3|3|4|5|7|7| Saved 1
-----------------
S C
-----------------
|X|1|3|3|4|5|7|7| Saved 6
-----------------
S C
-----------------
|X|1|3|3|4|5|6|7| Saved 7
-----------------
S C
Cuando tratamos de sustituir a 7, vemos un conflicto, entonces simplemente no lo colocamos. Continuamos a partir del índice de partida S, incrementarlo en 1:
-----------------
|X|1|3|3|4|5|6|7|
-----------------
S
1 está muy bien aquí, 3 tiene que mover
-----------------
|X|1|X|3|4|5|6|7|
-----------------
S
Pero 3 es un duplicado, por lo que tiramos a la basura y mantener iterando a través del resto de la matriz.
Básicamente, movemos cada entrada como máximo 1 vez e iteramos por toda la matriz. Eso es O (2n) = O (n)
idioma? ....... –
No estoy completamente seguro de que puede hacer esto para ser honesto. Quiero decir que hay un tipo de conteo, pero eso requiere espacio adicional. – zellio
Estoy con Mimisbrunnr - No estoy seguro de que se pueda hacer.Google sugiere que usar una hashmap (que probablemente no está permitida, aquí) es la manera más rápida y fácil de hacerlo; Si hubiera un algoritmo inteligente de tiempo lineal que no requiriera memoria extra, sería fácil de encontrar. –