Problema de matriz (principio de nido de paloma, intercambio digital, búsqueda de lista vinculada)

287. Buscando duplicados

  1. La matriz original no se puede cambiar (suponiendo que la matriz sea de solo lectura).
  2. Solo se puede usar espacio O (1) adicional  .
  3. La complejidad del tiempo es menor que  O ( n 2).
  4. Solo hay un número repetido en la matriz, pero puede aparecer más de una vez.

Debido a que no podemos cambiar la matriz original y solo usamos espacio O1 adicional , no podemos usar registros de mapas ni mantener una nueva matriz

Debido a que la complejidad del tiempo está dentro de n2 , la búsqueda de fuerza bruta tampoco es deseable

Debido a que el rango de datos es 1 ~ n-1 , se puede garantizar que la matriz no cruzará el límite, por lo que se utiliza el algoritmo de búsqueda de puntero rápido y lento en la lista vinculada

https://www.cnblogs.com/fankongkong/p/7007869.html

1. Cuando el puntero rápido solo toma un anillo más que el puntero lento , como se muestra

2. Al reunirse por primera vez, como se muestra

3. En este momento, reasigne rápido al principio, como se muestra en la figura

4. Si caminas dos veces, encontrarás el nodo de entrada del anillo

 

Reorganice los pasos y resuelva el problema.

El primer paso es encontrar el punto de encuentro en el ring. Use rápido y lento para señalar el encabezado de la lista vinculada, lento da un paso a la vez y rápido da dos pasos a la vez hasta que rápido == lento encuentra el punto de encuentro en el ring.

b) El segundo paso es encontrar la entrada del anillo. Siga el paso anterior, cuando rápido == lento, el número de nodos pasados ​​por rápido es 2x, el número de nodos pasados ​​por lento es x, y hay n nodos en el anillo, y rápido camina más que lento por 2x = n + x; n = x;

Se puede ver que lento en realidad dio un paso de un anillo, y luego dejó que apunte rápido al encabezado de la lista vinculada, y la posición de lento permanece sin cambios.

Suponiendo que la distancia desde el comienzo de la lista vinculada a la interfaz de anillo es y, como se muestra en la siguiente figura, xy representa la distancia recorrida por el puntero lento, excepto el comienzo de la lista vinculada y viajó en el anillo, luego lento y luego camina y pasos, en este momento el nodo rápido y lento Cuando los nodos se encuentran, rápido == lento, x-y + y = x = n , es decir, lento apunta a la entrada del anillo.

442. Datos duplicados en la matriz

Una mejor solución es el principio de nido de paloma + intercambio de datos.

Sin espacio adicional y sin complejidad de tiempo O ( n )

Coloque el número de tamaño i en la posición del subíndice i-1, y la posición restante después de la fila es incorrecta, es redundante.

Para el número k en la posición i, porque k! = i-1, entonces arroje k a la posición de k-1, y luego vea si el número cambiado es i-1, o continúe cambiando (un poco como un algoritmo de clasificación), cuando la posición es correcta, solo Ve a la siguiente posición.

Cuando se procesen todas las posiciones, escanee nuevamente y descubra que los números que no coinciden con la posición y los números son los números adicionales. Debido a que no se puede usar espacio adicional, el intercambio o intercambio sin memoria adicional (también es posible el intercambio más o menos).

public List <Integer> findDuplicates (int [] nums) { 
            Set <Integer> res = new HashSet <> (); 
            for (int i = 0; i <nums.length; i ++) { 
                while (nums [i]! = i + 1) { 
                    if (nums [i] == nums [nums [i] -1]) { 
                        res. agregar (nums [i]); 
                        descanso; 
                    } 
                    swap (nums, i, nums [i] -1); 
                } 
            } 

            System.out.println (res.toString ()); 
            devolver nueva ArrayList <> (res); 
        } 
        intercambio público vacío (int [] nums, int a, int b) { 
            nums [a] ^ = nums [b]; 
            nums [b] ^ = nums [a];
            nums [a] ^ = nums [b]; 
        }

  

Supongo que te gusta

Origin www.cnblogs.com/wjune-0405/p/12690872.html
Recomendado
Clasificación