[LeetCode en Python] 75 (M) Clasificación del color colores ordenar

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

Supongo que te gusta

Origin www.cnblogs.com/journeyonmyway/p/12549737.html
Recomendado
Clasificación