Oferta de Jianzhi: 59. El valor máximo de la ventana deslizante: análisis y código (Java)

Sword hace referencia a la oferta 59. Máximo análisis y código de ventana deslizante [Java]

1. Título

Dada una matriz y el tamaño de la ventana deslizante, encuentre el valor máximo de todas las ventanas deslizantes.
Por ejemplo, si la matriz de entrada {2,3,4,2,6,2,5,1} y el tamaño de la ventana deslizante 3, entonces hay 6 ventanas deslizantes en total, y sus valores máximos son {4, 4,6, 6,6,5};
hay 6 ventanas deslizantes para la matriz {2,3,4,2,6,2,5,1}:
{[2,3,4], 2,6, 2,5, 1}, {2, [3,4,2], 6,2,5,1}, {2,3, [4,2,6], 2,5,1}, {2, 3,4, [2,6,2], 5,1}, {2,3,4,2, [6,2,5], 1}, {2,3,4,2,6, [2 , 5, 1]}.

Dos, análisis y código

1. Cola auxiliar

(1) Pensando

Diseñe una cola auxiliar para almacenar las coordenadas del número que puede convertirse en el valor máximo en la ventana actual. Cuando la ventana se desliza:
1) Si el nuevo número es mayor o igual que el número correspondiente a las coordenadas de cola de la cola actual, muestre los números de cola uno por uno hasta que el nuevo número sea menor que el número de cola o la cola está vacío;
2) Cuando la cola está vacía o el nuevo número es menor que la cola de la cola actual Cuando la coordenada corresponde al número, el número puede convertirse en el valor máximo en la ventana y empujar su coordenada a la cola;
3) Determine si la coordenada del encabezado de la cola todavía está dentro del rango de la ventana, si está fuera del rango, muestre el número del encabezado.
En este momento, el número correspondiente a las coordenadas del encabezado de la cola es el valor máximo en la ventana deslizante.

(2) Código

import java.util.*;
public class Solution {
    
    
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
    
    
        ArrayList<Integer> ans = new ArrayList<>();
        if (num.length == 0 || size == 0)
            return ans;
        
        ArrayDeque<Integer> deq = new ArrayDeque<>();
        for (int i = 0; i < num.length; i++) {
    
    
            while (!deq.isEmpty() && num[deq.peekLast()] <= num[i])
                deq.pollLast();
            deq.add(i);
            if (deq.peekFirst() + size == i)
                deq.pollFirst();
            if (i >= size - 1)
                ans.add(num[deq.peekFirst()]);
        }
        
        return ans;
    }
}

(3) Resultados

Tiempo de ejecución: 26ms, memoria ocupada: 9512k.

Tres, otro

Nada.

Supongo que te gusta

Origin blog.csdn.net/zml66666/article/details/112127713
Recomendado
Clasificación