tema:
https://leetcode-cn.com/problems/sort-colors/
Dado un rojo, blanco y azul, un total de n elementos de la matriz, los ordena in situ, de tal manera que los elementos adyacentes con el mismo color y dispuestos en un blanco, para rojo, azul.
Esta pregunta, utilizamos un número entero de 0, 1 y 2 representan los colores rojo, blanco y azul.
Nota:
No se puede utilizar la base de código de función de clasificación para resolver esta cuestión.
Ejemplo:
Entrada: [2,0,2,1,1,0]
Salida: [0,0,1,1,2,2]
avanzado:
Una solución intuitiva es contar algoritmo de escaneo dos veces utilizando ordenó.
En primer lugar, el cálculo iterativo de la cantidad de elementos 0, 1 y 2, y luego ordenadas 0,1,2, sobrescribiendo la matriz actual.
Se puede pensar en una sola pasada, utilizando el espacio único algoritmo constante hacer?
Ideas de resolución de problemas
- Escanear de nuevo, registrar el número de elementos diferentes, y luego rellenar la matriz, es ciertamente posible, pero no es el propósito de la investigación
- 3 punteros, r, w, b se inicializa a 0,0, n-1, respectivamente, apuntando a la derecha de la rojo, el blanco lado derecho, azul lado izquierdo
- Si el punto actual Red w, entonces el elemento de conmutación r y w, = 1 y ambos +
- W y R en el lado izquierdo, por lo que el intercambio, siempre que r <w, entonces r sólo puede ser dirigida blanco, así que después de un intercambio de r + = 1
- Si w Actualmente está apuntando al blanco, entonces w + = 1
- Si w está apuntando actualmente a azul, entonces el elemento de conmutación b y w, a continuación, b- = 1
- Desde el lado derecho w b, de modo que después del intercambio, puntos pueden ser todavía w 3 posible, después de todo b- = 1, w no se mueven primero
- Loop hasta w a la derecha de b (mientras w <= b)
código
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# - sanity check
if not nums:
return nums
# - 3 pointers
# - r: right side of red
# - w: right white of white
# - b: left side of blue
r,w,b = 0,0,len(nums)-1
while w <= b:
if nums[w] == 0:
if w > r:
nums[r], nums[w] = nums[w], nums[r]
w += 1
r += 1
elif nums[w] == 1:
w += 1
elif nums[w] == 2:
if w < b:
nums[b], nums[w] = nums[w], nums[b]
b -= 1