Leetcode-day2 [75] Clasificación de color

75. Clasificación de colores

tema

Dada una nmatriz nums, 原地ordénelos de modo que los elementos del mismo color estén uno al lado del otro en el orden rojo, blanco y azul.

Usamos los números enteros 0, 1 y 2 para representar el rojo, el blanco y el azul, respectivamente.

Esto debe resolverse sin utilizar las sortfunciones .

ideas para resolver problemas

Después de leer el título, la solución general más fácil que se puede pensar es ordenar la matriz directamente. Aquí se utiliza el algoritmo de clasificación por inserción.

class Solution:
    def sortColors(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        for i in range(1,n):
            for j in range(i,0,-1):
                if nums[j] < nums[j-1]:
                    nums[j], nums[j-1] = nums[j-1], nums[j]
                else:
                    break

La idea general del algoritmo de clasificación por inserción es la siguiente: el algoritmo mantiene continuamente una matriz ordenada, asumimos que el inúmero anterior está en orden ascendente (descendente), y icuando 1gradualmente al tamaño de la matriz original n, entonces obtendremos la clasificación del resultado de la matriz original. En icada ciclo de aumento, debemos sacar el primer inúmero (el número a insertar), compararlo con el número anterior, y si es menor que (mayor que), intercambiar los dos números, y repetir este proceso hasta que Hasta que el número anterior no cumpla las condiciones anteriores, significa que la posición del elemento en este momento se ajusta al iorden ascendente (descendente) de todo el número anterior.

Análisis de Complejidad

  • Complejidad del tiempo: O ( n 2 ) O(n^2)O ( n2 )
  • Complejidad del espacio: O ( 1 ) O(1)O ( 1 )

Ideas para resolver problemas 【Aprendizaje】

75. Clasificación de colores (solución oficial)

dividir

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-NpWhBEtE-1681999331792) (C:\Users\MSTIFIY\AppData\Roaming\Typora \typora-user-images\ image-20230420205617921.png)]

La clave de este algoritmo es seguir la definición de partición , también conocida como bucle invariante . Tenga en cuenta que cada intervalo debe dejarse vacío desde el principio. La variable loop iapunta a los elementos a dividir.

from typing import List
class Solution:
    def sortColors(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        def swap(nums, index1, index2):
            """交换两个元素的位置"""
            nums[index1], nums[index2] = nums[index2], nums[index1]

        n = len(nums)
        if n < 2:
            """对于元素个数小于2的数组不需要排序"""
            return
        # all in [0, p0) == 0
        # all in [p0, i) == 1
        # all in (p2, n - 1] == 2
        p0 = 0
        i = 0
        p2 = n - 1
        
        while i <= p2:
            if nums[i] == 0:
                swap(nums, i, p0)
                i += 1
                p0 += 1
            elif nums[i] == 1:
                i += 1
            else:
                swap(nums, i, p2)
                p2 -= 1

作者:liweiwei1419
链接:https://leetcode.cn/problems/sort-colors/solution/kuai-su-pai-xu-partition-guo-cheng-she-ji-xun-huan/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Análisis de Complejidad

  • Complejidad del tiempo: O ( n ) O(n)O ( n )
  • Complejidad del espacio: O ( 1 ) O(1)O ( 1 )

Supongo que te gusta

Origin blog.csdn.net/qq_39784672/article/details/130276894
Recomendado
Clasificación