Planteamiento del problema
Dada una matriz con n objetos de color rojo, blanco o azul, una especie de ellos en el lugar por lo que los objetos del mismo color son adyacentes, con los colores en el orden rojo, blanco y azul.
A continuación, vamos a utilizar los números enteros 0, 1 y 2 para representar el color rojo, blanco y azul, respectivamente.
Nota: No se supone que debe utilizar función de clasificación de la biblioteca para este problema.
Ejemplo:
Entrada: [2,0,2,1,1,0]
Salida: [0,0,1,1,2,2]
Seguimiento:
- Una solución bastante sencillo es un algoritmo de dos pasos usando conteo tipo.
En primer lugar, iterate el número de matriz de conteo de 0 de, 1'S, y 2'S, entonces array sobrescritura con el número total de 0 de, luego 1 de y seguido de 2 de. - ¿Podría llegar a un algoritmo de una sola pasada, utilizando solamente el espacio constante?
problema enlace
Tutorial de vídeo
Usted puede encontrar el video tutorial detallado aquí
Proceso de pensamiento
Este es el clásico problema nacional de la bandera holandesa.
Dos pasadas con el espacio constante es fácil con recuento tipo. (Me recuerda a Radix clasificar de alguna manera) Una extensión sería lo que sucede si hay elementos de K (K> = 3)
Si hacerlo en una sola pasada, entonces la idea debe involucrar a los punteros y de intercambio. Empezar de izquierda a derecha, si es 1, pasar; si es 0, mover a la izquierda; si 2, mueva hacia la derecha
soluciones
pase de dos
1 público void sortColorsCountingSort ( int [] A) { 2 si (A == nula || a.length == 0) de retorno ; 3 4 int [] cubos = nuevo int [3 ]; 5 6 para ( int i = 0; i <a.length; i ++ ) { 7 cubos [A [i]] + = 1 ; 8 } 9 10 int index = 0 ; 11 para ( int i = 0; i <3; i ++ ) { 12 para( Int j = 0; j <cubos [i]; j ++ ) { 13 A [index] = i; 14 índice ++ ; 15 } 16 } 17 }
Tiempo Complejidad: O (N), donde N es el tamaño de la matriz, N + 3 * N = 4 N = O (N)
Espacio Complejidad: O (1), ya que sólo necesitan 3 elementos en este caso, todavía se considera constante
Un pase
1 públicas void sortColors ( int [] A) { 2 si (A == nula || a.length == 0) de retorno ; 3 4 int izquierda = 0 ; 5 int derecha = a.length - 1 ; 6 7 int i = 0 ; 8 , mientras que (i <= derecha) { // tiene que ser <=, ya que el valor cur todavía necesita ser evaluado si intercambiado espalda 9 si (A [i] == 1 ) { 10 i ++ ; 11 } demás si(A [i] == 0 ) { 12 swap (A, I, izquierda); 13 izquierda ++ ; 14 i ++; // no se olvide de éste, sólo podemos intercambiar 0 o 1 vuelta aquí, por lo que seguir adelante sin importar lo que 15 } demás { // A [i] == 2 16 swap (a, i, a la derecha); 17 derecha- ; 18 } 19 } 20 }
Tiempo Complejidad: O (N), donde N es el tamaño de la matriz
Espacio Complejidad: O (1)