El tema es de LeetCode
Se puede acceder a otras soluciones o código fuente: tongji4m3
descripción
Dada una matriz de n elementos que contienen rojo, blanco y azul, ordénelos en su lugar para que los elementos del mismo color estén adyacentes y dispuestos en el orden de rojo, blanco y azul.
En esta pregunta, usamos los números enteros 0, 1 y 2 para representar el rojo, el blanco y el azul, respectivamente.
Nota:
No puede utilizar la función de clasificación en el código base para resolver este problema.
Ejemplo:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
Avanzado:
Una solución intuitiva es utilizar un algoritmo de escaneo de dos pasos para contar y clasificar.
Primero, calcule iterativamente el número de elementos 0, 1 y 2, y luego reescriba la matriz actual en el orden de 0, 1 y 2.
¿Puede pensar en un algoritmo de escaneo de una pasada que use solo espacio constante?
Ideas
Usando la idea de partición de clasificación rápida, defina punteros al principio y al final de la matriz, lo identifica el final de 0 (garantice que lo-1 debe ser 0) y hi identifica el comienzo de 2 (garantice que hi + 1 debe ser 2). Luego use el puntero i. Iterar sobre la matriz
Un mejor caso de prueba2 0 1 0 1 2
Código
public void sortColors(int[] nums)
{
int lo=0,hi=nums.length-1;
int i=0;
while(i<=hi)
{
if(nums[i]==0)
{
//exch(nums,i++,lo++); 由于特殊性,化简
nums[i++] = nums[lo];
nums[lo++] = 0;
}
else if(nums[i]==1)
{
++i;
}
else
{
// exch(nums,i,hi--);
nums[i] = nums[hi];
nums[hi--] = 2;
}
}
}