Si hay una matriz de 101 números que consiste en números del 1 al 100 con el número repetido, ¿cómo encuentra el número repetido en el número mínimo de iteraciones (en el programa C)?

Hay varias maneras de hacer esto. Enumeraré los métodos para aumentar la eficiencia:

Usando la clasificación:

Complejidad de tiempo: O (N * log N)

Complejidad espacial: O (N)

Algoritmo

Ordene la matriz en orden ascendente (o descendente). Comience desde el primer elemento y compare el elemento actual con el siguiente elemento; si son iguales, imprima este elemento y rompa el ciclo; de lo contrario, continúe este proceso hasta el segundo último elemento.

Implementación de C ++:

#include
usando el espacio de nombres estándar;
int main () {
vector arr (101);
cout << "Lea su matriz:" << endl;
para (auto & i: arr)
cin >> i;
sort (arr.begin (), arr.end ());
para (int i = 0; i <n – 1; ++ i) {
if (arr [i] == arr [i + 1]) {
cout << "Número duplicado =" << arr [i];
devuelve 0;
}
}
cout << "No hay duplicados";
}

2. Utilizando la tabla Hash implementada en matriz:

Complejidad de tiempo: O (N)

Complejidad espacial: 0 (N)

Algoritmo

Cree una matriz auxiliar booleana llamada como cuenta, cuyo elemento se inicializa en falso. Cuente la ocurrencia de todos los elementos. El recuento de un elemento i se almacenará en el recuento [i – 1] (i es un entero de entrada). Si el recuento [i-1] es verdadero, imprima; de lo contrario, asigne el conteo [i-1] a verdadero.

Implementación de C ++:

#include
usando el espacio de nombres estándar;
int main () {
vector cuenta (100, falso);
cout << "Lea su matriz:" << endl;
para (int j = 0; j <101; ++ j) {
int i;
cin >> i;
if (cuenta [i – 1]) {
cout << "Número duplicado =" << i;
devuelve 0;
}
cuenta [i – 1] = verdadero;
}
cout << "No hay duplicados";
}

3. Enfoque más rápido: utilice la operación XOR.

Complejidad de tiempo: O (N)

Complejidad espacial: O (1)

Algoritmo

Tome XOR de todos los números en el rango de 1 a 100. Ahora tome XOR de todos los elementos de la matriz de entrada. El resultado de la variable XORed será la respuesta.

Implementación de C ++:

#include
int main () {
int xor = 1;
para (int i = 2; i <= 100; ++ i)
xor ^ = i;
cout << "Lea su matriz:";
para (int i = 0; i <101; ++ i) {
int temp;
cin >> temp;
xor ^ = temp;
}
si (! xor)
cout << "Número duplicado =" << xor;
más
cout << "No hay duplicados";
}

Bueno, si puede asegurarse de que solo se repite un número , y los números van del 1 al 100 , con un incremento de uno , puede hacer

// Considerando que los números están en una matriz llamada ‘lista’
int suma = 0;
para (int i = 0; i suma + = lista [i];
}
int esperado_sum = (100 * (100 + 1)) / 2;
printf (suma – suma esperada);

Esto simplemente funciona porque hacemos uso de la progresión aritmética. Más de eso, aquí

Si no puede asegurar las condiciones dadas, lo mejor sería ordenar la matriz y luego recorrerla linealmente. Preferiría Merge Sort para ordenar la matriz. Mire aquí para aprender cómo implementar Merge Sort.

Después de ordenar su matriz, el código es bastante simple

para (int i = 0; i if (list [i] == list [i + 1]) {
printf (“Duplicado encontrado% d”, lista [i]);
rotura;
}
}

Aquí hay un hilo similar en Computer Science Stack Exchange aquí

Solo necesitamos 1 iteración para resolverlo.

El concepto principal que estamos usando aquí es el enunciado de la pregunta en sí. Dice que una matriz de tamaño 101 contiene números del 1 al 100. Entonces, si suponemos que no se repite ningún número, la suma será (100 * (100 + 1)) / 2. Podemos encontrar la suma real de una matriz dada en una iteración. Entonces podemos restar el (100 * (100 + 1)) / 2 de la suma real. No estoy escribiendo el código aquí, ya que creo que será mejor si lo intentas tú mismo.

También puede usar el enmascaramiento para este problema. El enmascaramiento también usará una sola iteración. Como los números que contiene la matriz son del 1 al 100 para una matriz de tamaño 101, entonces atravesamos la matriz y vamos al índice para el valor-1 (-1 como la matriz es de base 0), por lo que al final el valor repetido tendrá un valor positivo valor.

Consulte el siguiente código a continuación. He usado 1 indexación base aquí.

para (int i = 1; i <= n; i ++)

{

cin >> a [i];

}

para (int i = 1; i <= n; i ++)

{

if (a [abs (a [i])]> = 0)

{

a [abs (a [i])] * = – 1;

}

más

{

rep = abs (a [i]);

}

}

Espero que esto ayude.

Hay dos posibles soluciones.

Método 1:

Condición: puede cambiar elementos en la matriz y, como su caso lo indica, no hay números negativos en la matriz.

atravesar la matriz para i = 0 a 100 elementos
{
compruebe si hay signos de matriz [abs (matriz [i]) – 1];
si es positivo entonces
hacerlo negativo usando
Array [abs (Array [i]) – 1] = -Array [abs (Array [i]) – 1];
más
este elemento (i th elemento de la matriz) es una repetición
}

Cómo funciona

Básicamente, está utilizando el signo de un elemento como un interruptor, lo activa si ha visto el número anteriormente,

Entonces, en caso de que vea un interruptor que ya está activado, comprende que ha visto ese número y puede identificarlo fácilmente

¿Por qué reste 1!

En la programación en C, el índice de matriz comienza desde 0 y el número mínimo es 1, por lo que para llevarlos a la misma página resté 1

Complejidad

O (n), espacio extra no requerido

¡Ahora qué pasa si no puedes editar la matriz!

Tenemos otro método para ello.

Método 2:

Use otra matriz de tamaño booleana (valor máximo-valor mínimo) y úsela como un interruptor

¿Qué pasa si tenemos un número negativo?

Recuerda por qué resté 1. Sí, tienes razón, en lugar de restar 1, suma el mínimo número negativo posible

Complejidad

O (n), espacio extra: O (n) necesitará una matriz de tamaño n para n + 1 elementos en la matriz original

More Interesting

¿Cuántos números debajo de [matemática] 10 ^ n [/ matemática] hay cuyos dígitos suman [matemática] [/ matemática]?

¿Se puede estafar el algoritmo de Zoopla para inflar el precio de una propiedad?

¿Cuáles son las mejores prácticas para usar algoritmos de Machine Learning con Android?

¿El conocimiento en algoritmos y estructuras de datos le ayuda a avanzar en el campo de la programación?

¿Por qué no puedo resolver mi Cubo de Rubik de 4 x 4 x 4 como un cubo de Rubik de 3 x 3 x 3 si ya he hecho los centros y los bordes?

¿Cuál es la mejor manera de reorganizar los datos en la lista para que dos elementos similares no estén uno al lado del otro?

¿Es posible usar los poderes de una matriz de adyacencia para calcular las rutas más cortas que BFS calcularía?

¿Cuál es el algoritmo más extraño que hayas usado?

¿Cuál es el propósito de estudiar pequeñas mejoras (como usar dos hilos o evitar la basura) mientras puedo reducir la complejidad de los algoritmos?

¿Es difícil implementar un árbol de radix? Si es así, ¿por qué?

¿Cuáles son algunos buenos nombres de variables / métodos junto con la descripción donde encajan?

¿Cuáles son los beneficios del algoritmo de retropropagación frente a la estimación numérica del gradiente?

¿Qué 'palabras' debo saber para resolver problemas de programación o problemas matemáticos relacionados?

¿Qué alternativas hay para los algoritmos de escalada?

¿Por qué las listas enlazadas son más convenientes que las matrices en el dominio de la computación simbólica?