Las preguntas de la entrevista deben cepillarse: rutina de plantilla de Python de pila monótona (con una explicación detallada de los ejemplos de uso)

Problema de pila monotónica:

Para saber para qué tipo de problemas es adecuada la pila monótona, primero debe conocer el papel de la pila monótona. La pila monótona se divide en una pila creciente monótona y una pila decreciente monótona. Al usar la pila monótona, podemos acceder al siguiente elemento más grande (más pequeño) que él (o podemos).

Es decir, en una cola o un arreglo, solemos usar una pila monótona cuando necesitamos comparar la relación de tamaño de los elementos antes y después para resolver el problema. A continuación, presentamos brevemente el problema de la reducción de la pila monótona y el aumento de la pila monótona para explicar con más detalle el proceso de uso de la pila monótona para resolver el problema.

¿Cuándo usar una pila monótona?
Por lo general, es una matriz unidimensional. Es necesario encontrar el primer elemento a la derecha (izquierda) de cualquier elemento que sea más grande (más pequeño) que él mismo y requiera O (n) tiempo de complejidad.

Principio de pila monotónica:

Pila que aumenta monótonamente: aumenta desde la parte inferior de la pila hasta la parte superior de la pila, la parte superior de la pila es grande
Pila monótonamente decreciente: disminuye desde la parte inferior hasta la parte superior de la pila, y la parte superior de la pila es pequeña

Rutinas de plantilla de Python:

1) : encuentre la primera posición más grande que él mismo para el elemento actual a la derecha: mantenga una pila monótonamente decreciente de derecha a izquierda.

def nextGreaterElement_01(nums: list):
    length = len(nums)
    res, stack = [-1] * length, []

    for i in range(length - 1, -1, -1):
        while stack and stack[-1] <= nums[i]:
            stack.pop()
        if stack:
            res[i] = stack[-1]
        stack.append(nums[i])

    return res

O el elemento actual a la derecha para encontrar la primera posición más grande que él mismo: mantenga una pila monótonamente decreciente de izquierda a derecha.

def nextGreaterElement_011(nums: list):
    length = len(nums)
    res, stack = [-1] * length, []

    for i in range(length):
        while stack and nums[stack[-1]] < nums[i]:
            idx = stack.pop()
            res[idx] = nums[i]
        stack.append(i)

    return res

2) : Encuentre la primera posición más pequeña que ella para el elemento actual a la derecha: mantenga una pila que aumenta monótonamente de derecha a izquierda

def nextGreaterElement_02(nums: list):
    length = len(nums)
    res, stack = [-1] * length, []

    for i in range(length - 1, -1, -1):
        while stack and stack[-1] >= nums[i]:
            stack.pop()
        if stack:
            res[i] = stack[-1]
        stack.append(nums[i])

    return res

3) : Encuentre la primera posición más grande que él mismo para el elemento actual a la izquierda: mantenga una pila monótonamente decreciente de izquierda a derecha

def nextGreaterElement_03(nums: list):
    length = len(nums)
    res, stack = [-1] * length, []

    for i in range(length):
        while stack and stack[-1] <= nums[i]:
            stack.pop()
        if stack:
            res[i] = stack[-1]
        stack.append(nums[i])

    return res

4) : Encuentre la primera posición más pequeña que ella para el elemento actual a la izquierda: mantenga una pila que aumenta monótonamente de izquierda a derecha

def nextGreaterElement_04(nums: list):
    length = len(nums)
    res, stack = [-1] * length, []

    for i in range(length):
        while stack and stack[-1] >= nums[i]:
            stack.pop()
        if stack:
            res[i] = stack[-1]
        stack.append(nums[i])

    return res

Fuente de referencia: https://leetcode-cn.com/problems/next-greater-element-i/solution/dan-diao-zhan-zong-jie-by-wu-xian-sen-2/

Supongo que te gusta

Origin blog.csdn.net/weixin_44414948/article/details/114385843
Recomendado
Clasificación