Cómo eliminar elementos duplicados ordenados array (puntero de velocidad)

 

 

Descripción del enlace

¿Cómo eliminar elementos duplicados en una serie ordenada

Sabemos que para las matrices, en la inserción de la cola, los elementos de eliminación son relativamente eficientes, complejidad del tiempo es O (1), pero si está insertada al principio o en el medio, elementos de eliminar, implicará mover datos, la complejidad del tiempo es O (N), menos eficiente.

Así que para el problema general de hacer frente a una serie de algoritmos, queremos solamente los elementos de la serie final de la operación como sea posible, para evitar la complejidad de tiempo extra.

En este artículo se habla de cómo ir pesado en un arreglo ordenado, mirada bajo el tema:

Obviamente, ya que la matriz ya está ordenado, por lo que debemos duplicar los elementos juntos, no son difíciles de encontrar, pero si encuentra un duplicado cada elemento borrar inmediatamente, operación de eliminación se encuentra en medio de la matriz, la complejidad general el tiempo es a su alcance O (N ^ 2). Y el tema nos obliga a la edición lugar, lo que significa que la ayuda no se puede utilizar el espacio complejidad matriz tiene que ser O (1).

De hecho, para una serie de cuestiones relacionadas con el algoritmo, hay un truco común: Trate de evitar los elementos de eliminación en el medio, que quería una manera de cambiar este elemento para el último en irse. En este caso, el elemento final se va a eliminar de la matriz están arrastrando cola, uno por uno, estallar hacia fuera en la línea, la complejidad de tiempo de cada operación se reducirá a O (1) a.

De acuerdo con esta idea de ella, pero se pueden derivar de una forma común de resolver necesidades similares: un doble habilidades puntero. Específicamente, puede ser una velocidad del puntero.

Hacemos lenta puntero  slow Ir a la izquierda detrás, manos rápidas  fast caminar delante de Pathfinder, no encuentran una serie de elementos duplicados que contar  slow y hacer  slow aún más antes. Así que cuando  fast el puntero para recorrer toda la gama  nums después, nums[0..slow] simplemente no repetir los elementos, todos los elementos se repiten elementos.

RemoveDuplicates int ( int [] nums) {
     int n = nums .length; si (n == 0) de retorno 0; int lento = 0, rápido = 1; mientras que (rápido <n) { si (nums [rápido] = nums [lento]!) {lenta ++; //维护nums [0..slow]无重复nums [lento] = nums [rápido]; } Rápida ++; } //长度为索引+ 1 retorno lento + 1; }

Mira el proceso de ejecución del algoritmo:

A continuación, una simple extensión de que, si se le da una lista ordenada, cómo volver a hacer? De hecho, y los arreglos son exactamente lo mismo, la única diferencia es el puntero del operador de asignación array sólo entre en funcionamiento:

NodoLista deleteDuplicates ( cabeza NodoLista) {
     si (cabeza == null) retorno nulo; NodoLista lento = cabeza, rápido = cabeza .Next; mientras que (rápido ! = null) { si (rápido .val = lento! .val) { // nums [lenta] = nums [rápido]; lento .Next = velocidad rápida; // lento ++; lento = velocidad lenta .Next; } // rápida ++ rápida = rápido .Next; } //断开与后面重复元素的连接lenta .Next = nula; cabeza retorno; }

Supongo que te gusta

Origin www.cnblogs.com/-wenli/p/12512870.html
Recomendado
Clasificación