Sobes.tech
Middle — Senior

¿Cómo declarar y mantener el máximo al desplazar la ventana?

sobes.tech AI

Respuesta de la IA

Para mantener el máximo en una ventana al desplazarla, a menudo se utiliza una estructura de datos: una cola doble (deque). La idea es almacenar los índices de los elementos en orden decreciente de sus valores, de modo que:

  • Al agregar un nuevo elemento, se eliminan del final de la cola todos los elementos menores que el nuevo, ya que no pueden ser el máximo.
  • Al desplazar la ventana, se eliminan del principio de la cola los elementos que han salido del rango de la ventana.

Esto permite obtener el máximo en la ventana actual en O(1), y procesar todo el array en O(n).

Ejemplo en Python:

from collections import deque

def max_sliding_window(nums, k):
    dq = deque()  # almacena índices
    result = []
    for i, num in enumerate(nums):
        while dq and nums[dq[-1]] < num:
            dq.pop()
        dq.append(i)
        if dq[0] == i - k:
            dq.popleft()
        if i >= k - 1:
            result.append(nums[dq[0]])
    return result

# Ejemplo de uso
print(max_sliding_window([1,3,-1,-3,5,3,6,7], 3))  # [3,3,5,5,6,7]