Leecode75 colores de clasificación

Descripción del título

Ahora hay una matriz de n objetos, donde el color de los objetos es rojo, blanco o azul, clasifique la matriz de manera que los objetos del mismo color sean adyacentes y el orden de los colores sea rojo, blanco, azul
Usamos 0,1,2 para representar los colores rojo, blanco y azul respectivamente.
Nota:
Esta pregunta requiere que no pueda usar la función de biblioteca de clasificación.
Extensión:
Una solución muy sencilla es un algoritmo de clasificación de conteo de dos pasos.
Primero: iterar a través de la matriz, registrando 0,1 , El número de 2, y luego reescribe la matriz, primero escribe 0, luego escribe 1, y luego escribe 2
Puedes dar un algoritmo de un paso que puede resolver este problema en una complejidad espacial constante Es?

Análisis

  • En términos simples, una matriz de 0,1,2 se ordena por un algoritmo in situ.
  • Establezca los punteros izquierdo y derecho, respectivamente, el lado izquierdo es todo 0, la izquierda apunta al primer elemento distinto de cero desde la izquierda, la derecha apunta a la derecha, el primer elemento no 2.
  • Cur izquierda se garantiza que sea 0 y este último 1.
  • Cur se mueve de izquierda a derecha y salta cuando encuentra 1; cuando encuentra 2, intercambia con el elemento de la derecha. El elemento de la derecha es 0 o 1. En este momento, la derecha se reemplaza por 2, derecha–; cuando 0, y la izquierda En el intercambio de elementos, dado que el lado izquierdo de cur es solo 0 o 1, entonces el elemento señalado por la izquierda debe ser 1. Después de este intercambio, el elemento señalado por la izquierda se convierte en 0, y la izquierda se puede mover hacia la derecha. En este momento, el elemento en cur es 1, y debe moverse hacia la derecha.

código java

public class Solution {
    public void sortColors(int[] A) {
        if(A == null || A.length <= 1){
            return;
        }
        //本质就是0 1 2元素的数组排序
        //left 从左向右 指向第一个非0元素
        int left = 0;
        while(left < A.length && A[left] == 0){
            left++;
        }
        //right 从右向左 指向第一个非2 元素
        int right = A.length-1;
        while(right > 0 && A[right] == 2){
            right--;
        }
        int cur = left;
        
        while(cur <= right){
            if(A[cur] == 1){ 
                cur++;
            }else if(A[cur] == 0){
                swap(A,cur,left);
               left++;
                cur++;
            }else{               
                swap(A,cur,right);
                right--;               
            }
        }
    }    
    public void swap(int [] A, int i ,int j){
        int temp = A[i];
        A[i] = A[j];
        A[j] = temp;
    }
}
Publicado 72 artículos originales · elogiado 0 · visitas 719

Supongo que te gusta

Origin blog.csdn.net/weixin_40300702/article/details/105538418
Recomendado
Clasificación