Aquí hay un algoritmo que toma O (n) tiempo y O (1) espacio
Observaciones: –
La respuesta siempre está en [1, len (array)] (fácil de probar, pruébalo tú mismo)
Algoritmo:-
denotamos nuestra matriz con A [] e índices iterativos con i
Paso 1:-
Iterar a través de la matriz A
establecer cur_val = A [i]
si cur_val es negativo o mayor que n, entonces
continuar / ignorar
más
establezca cur_val en la posición de la matriz con index = cur_val
Entonces, después de que nuestro algoritmo termina la ejecución, coloca elementos en la matriz en el rango (0, n) en índices que son iguales a su valor.
- ¿Existe un algoritmo de tiempo O (N) para esta pregunta?
- ¿Por qué la recursión me causa tantos problemas?
- ¿Dejarías que los algoritmos se intercambiaran por ti cuando estés en el trabajo?
- Lo que algunos deben saber son punteros para la optimización del código fundamental en Java
- Si recibe fondos de miles de millones de dólares y tiene la tarea de crear un motor de búsqueda para competir con Google, ¿cómo sería su motor de búsqueda?
Paso 2:-
Ahora solo recorra nuevamente la matriz y descubra para qué índice más pequeño i> = 1, A [i]! = I, informe que i
Ejecución del algoritmo para el caso de prueba 1: –
A [] = {1,2,0}
después del paso 1: – A [] = {0,1,2}
después del paso 2: – ans = 3, (ya que para todos los 1 <= índices <3 A [i] == i)
Ejecución del algoritmo para el caso de prueba 2: –
A [] = {3,4, -1,1}
después del paso 1: – A [] = {3,1, -1,3}
después del paso 2: – ans = 2, (ya que A [2]! = 2, observe que la respuesta no puede ser 0 ya que tenemos que encontrar el número positivo más pequeño)
Aquí hay una implementación de esa idea en C ++: –
#include
usando el espacio de nombres estándar;
int main () {
int n, t;
vector v;
cout << "Ingrese el tamaño de la matriz \ n";
cin >> n;
cout << "Ahora ingrese" << n << "elementos \ n";
para (int i = 0; i <n; ++ i) {
cin >> t;
v.push_back (t);
}
para (int i = 0; i <n; i ++) {
int val = v [i];
if ((val = v.size ())) {continuar;}
int curval = v [i], nextval = v [v [i]];
while (curval! = nextval) {
v [curval] = curval;
curval = nextval;
if ((curval = v.size ())) {continuar;}
nextval = v [nextval];
}
}
cout << "\ nMatriz final \ n";
for (int i = 0; i <v.size (); i ++) {
cout << v [i] << "";
}
// cout << "\ n";
int ans = v.size ();
for (int i = 1; i <v.size (); i ++) {
if (v [i]! = i) {
ans = i;
descanso;
}
}
cout << "\ n \ nAns: -";
cout << ans << "\ n";
}
Aquí hay un enlace sobre cómo usar este código Ideone.com