Sujet:
Étant donné un tableau d'entiers nums, il existe une fenêtre glissante de taille k qui se déplace du côté le plus à gauche du tableau vers le côté le plus à droite du tableau. Vous ne pouvez voir les nombres k que dans la fenêtre coulissante. La fenêtre coulissante ne se déplace que d'une position vers la droite à la fois.
Renvoie la valeur maximale dans la fenêtre glissante.
Exemple 1:
Entrée: nums = [1,3, -1, -3,5,3,6,7], k = 3
Sortie: [3,3,5,5,6,7]
Explication:
La position maximale du glissement la fenêtre
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
Exemple 2:
Entrée: nums = [1], k = 1
Sortie: [1]
Exemple 3:
Entrée: nums = [1, -1], k = 1
Sortie: [1, -1]
Exemple 4:
Entrée: nums = [9,11], k = 2
Sortie: [11]
Exemple 5:
Entrée: nums = [4, -2], k = 2
Sortie: [4]
Idée:
L'idée au début est en fait de parcourir la valeur de chaque fenêtre de la pile,
et chaque fois que la valeur de la pile max est renvoyée à ans.
Cependant, parce que la fonction max est trop inefficace pour parcourir l'échantillon
avec trop beaucoup de calcul, il est utilisé La méthode de la fenêtre glissante simplifie l'idée pour éviter d'utiliser la fonction max:
Parcourez d'abord les nombres un par un et conservez une pile décroissante de façon monotone.
Commencez par insérer l'index de la première valeur dans la pile.
Si la valeur parcourue ultérieurement est inférieure à la plus petite valeur correspondant à l'index de la pile, indexez directement dans le pile
tant que la valeur parcourue plus tard est supérieure à Si la valeur correspondant à l'index dans la pile est supérieure ou égale, la dernière valeur est supprimée
jusqu'à ce que la valeur parcourue plus tard soit inférieure à la valeur correspondant à l'index dans la pile, alors l'index correspondant est poussé sur la pile
pour maintenir une pile décroissante de manière monotone à plusieurs reprises
Mais comme la longueur de k (fenêtre glissante) est fixe,
utilisez la méthode de la fenêtre glissante.
Si l'indice de la valeur maximale est plus petit que la limite gauche de la fenêtre (i-k), la valeur la plus à gauche est supprimée
et i est le réel- limite de temps à droite, aucun traitement n'est donc nécessaire. Marge de droite
En même temps que la fenêtre existe (i + 1> k):
chaque parcours (fenêtre mobile) ajoute la valeur maximale correspondant à l'index de la valeur maximale dans la pile à ans
Code:
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
a = collections.deque()
ans = []
for i in range(len(nums)):
while a and nums[a[-1]] <= nums[i]:
a.pop()
a.append(i)
if a[0] <= i - k:
a.popleft()
if i + 1 >= k:
ans.append(nums[a[0]])
return ans
Résultat: