[LeetCode] 239. Fenêtre coulissante maximum (dur) (JAVA)
Adresse titre: https://leetcode.com/problems/sliding-window-maximum/
Description du titre:
On vous donne un tableau d'entiers nums, il y a une fenêtre glissante de taille k qui se déplace de l'extrême gauche du tableau vers l'extrême droite. Vous ne pouvez voir que les nombres k dans la fenêtre. Chaque fois que la fenêtre coulissante se déplace vers la droite d'une position.
Renvoie la fenêtre coulissante max.
Exemple 1:
Input: nums = [1,3,-1,-3,5,3,6,7], k = 3
Output: [3,3,5,5,6,7]
Explanation:
Window position Max
--------------- -----
[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:
Input: nums = [1], k = 1
Output: [1]
Exemple 3:
Input: nums = [1,-1], k = 1
Output: [1,-1]
Exemple 4:
Input: nums = [9,11], k = 2
Output: [11]
Exemple 5:
Input: nums = [4,-2], k = 2
Output: [4]
Contraintes:
- 1 <= longueur numérique <= 10 ^ 5
- -10 ^ 4 <= nums [i] <= 10 ^ 4
- 1 <= k <= longueur numérique
Idée générale
Étant donné un tableau nums, une fenêtre glissante de taille k 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 se déplace d'une seule position vers la droite à la fois.
Renvoie la valeur maximale dans la fenêtre glissante.
Avancée:
Pouvez-vous résoudre ce problème en complexité temporelle linéaire?
Méthode de résolution de problèmes
- Si la complexité temporelle est O (n), la méthode violente ne doit pas être utilisée, et la complexité temporelle de la méthode violente est O (kn)
- À l'aide de la méthode de file d'attente bidirectionnelle, la valeur maximale est stockée en haut de la file d'attente et la dernière valeur inférieure à la valeur actuelle est supprimée de la file d'attente avant que chaque valeur ne soit stockée, de sorte que la file d'attente est triée du plus grand au plus petit (LinkedList est utilisé ici)
- Lorsque la fenêtre glisse, vous devez supprimer la valeur supérieure de la fenêtre précédente. Si la valeur supprimée n'est que la valeur supérieure de la file d'attente, c'est-à-dire la valeur maximale, vous devez également supprimer la valeur située devant la file d'attente. , puis prenez la valeur supérieure de la file d'attente. Valeur maximale de la fenêtre actuelle
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (k == 1) return nums;
int[] res = new int[nums.length - k + 1];
LinkedList<Integer> list = new LinkedList<>();
for (int i = 0; i < nums.length; i++) {
if (i >= k && nums[i - k] == list.get(0)) list.removeFirst();
while (list.size() > 0 && list.getLast() < nums[i]) {
list.removeLast();
}
list.add(nums[i]);
if (i >= k - 1) res[i - k + 1] = list.get(0);
}
return res;
}
}
Temps d'exécution: 34 ms, battant 57,94% des utilisateurs Java
Consommation de mémoire: 50 Mo, battant 72,20% des utilisateurs Java
![](https://img-blog.csdnimg.cn/20201107174624800.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE2OTI3ODUz,size_16,color_FFFFFF,t_70#pic_center)