py_sliding_window_maximum · Python
▶ Aprender py_sliding_window_maximum (Python) paso a paso · explicación de py_sliding_window_maximum
Código línea a línea
Tres columnas: el código, el trozo del subject o del main que obliga a escribir esa línea, y el por qué.
py_sliding_window_maximum.py
| Código | Subject | Por qué |
|---|---|---|
def sliding_window_maximum(nums: list[int], k: int) -> list[int]: | def sliding_window_maximum(nums: list[int], k: int) -> list[int]: | Firma del subject. |
if k <= 0 or k > len(nums): | Handle edge cases (empty array, k <= 0, k > array length) | Ventana imposible. Con nums vacío, k > 0 ya es mayor que la longitud. |
return [] | Return empty list for invalid inputs | Vacía. |
result = [] | Return a list of maximum values | Un máximo por ventana. |
candidates = [] | Índices de candidatos a máximo, con valores decrecientes de izquierda a derecha. El de la cabeza es el máximo de la ventana actual. | |
head = 0 | Índice de la cabeza dentro de candidates. Avanzarlo es "sacar por delante" sin el O(n) de pop(0) ni importar deque. | |
for i, value in enumerate(nums): | Slide a window of size k through the array | Un elemento por iteración. |
while len(candidates) > head and nums[candidates[-1]] <= value: | Todo candidato menor o igual al nuevo ya nunca será máximo (el nuevo es más grande y dura más): fuera por la cola. | |
candidates.pop() | Descarto. | |
candidates.append(i) | El nuevo entra por la cola. | |
if candidates[head] <= i - k: | La cabeza se ha salido de la ventana (i - k ya no está dentro): avanzo. | |
head += 1 | Siguiente candidato. | |
if i >= k - 1: | Find the maximum element in each window position | A partir de que la primera ventana está completa, emito un máximo por posición. |
result.append(nums[candidates[head]]) | La cabeza es el mayor de la ventana. | |
return result | Máximos. |