239. Ventana corredera máxima
Ideas para resolver problemas
- La clave para calcular el valor máximo de cada ventana deslizante es utilizar la cola monótona para implementar la ventana.
- Para una cola monótona, agregue elementos al final y elimine elementos del encabezado.
- Operación de agregar elemento: realizar un bucle desde el final y eliminar elementos más pequeños que el elemento actual
- Obtenga el elemento de valor máximo y obtenga el elemento principal directamente
- La operación de eliminación de elemento elimina directamente el elemento principal.
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
MonotonicQueue window = new MonotonicQueue();
List<Integer> res = new ArrayList<>();
for(int i = 0; i < nums.length; i++){
if(i < k - 1){
window.push(nums[i]);
}else{
window.push(nums[i]);
res.add(window.max());
window.pop(nums[i - k + 1]);
}
}
int[] arr = new int[res.size()];
for(int i = 0; i < res.size(); i++){
arr[i] = res.get(i);
}
return arr;
}
class MonotonicQueue{
private LinkedList<Integer> maxq = new LinkedList<>();
public void push(int n){
while(!maxq.isEmpty() && maxq.getLast() < n){
maxq.pollLast();
}
maxq.addLast(n);
}
public int max(){
return maxq.getFirst();
}
public void pop(int n){
if(n == maxq.getFirst()){
maxq.pollFirst();
}
}
}
}