[Oferta de dedo de espada] _19 El valor máximo en la ventana deslizante

Descripción del título

Dado el tamaño de una matriz y ventanas deslizantes, 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 son 3, entonces hay un total de 6 ventanas deslizantes y sus valores máximos son {4,4,6, 6,6,5}; La ventana deslizante para la matriz {2,3,4,2,6,2,5,1} tiene el siguiente 6: {[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]}.

Ideas para resolver problemas

  1. Solución 1: método de fuerza bruta, exploración secuencial de bloques. Por ejemplo, en el ejemplo anterior, continuamos agrupando y buscando, un grupo de 3, para que eventualmente encuentre su valor máximo. Pero su complejidad temporal es O (NK). N es el número de ventanas deslizantes y K es el tamaño de la ventana deslizante.
  2. Opción 2: implementación de cola de doble finalización. Como los pasos implementados en el esquema dos son más complicados, hemos cambiado la forma de pensar: en el proceso de obtener el valor máximo, no almacenamos cada valor en la cola, sino que solo almacenamos los datos que pueden convertirse en el valor máximo. Para la eliminación en ambos extremos, la entrada anterior se utiliza como ejemplo, y el proceso de solución es el siguiente:

Inserte la descripción de la imagen aquí

Implementación de código

class Solution {
    vector<int> res;
    deque<int> q;
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size)
    {
        if(num.size()>=size && size >= 1)  //保证参数合理性
        {
            //取一个窗口中的最大值的下标
            for(int i=0;i<size;++i)
            {
                if(!q.empty() && num[q.back()]<=num[i])
                    q.pop_back();
                q.push_back(i);
            }
            
            //处理后面
            for(int i = size;i<num.size();++i)
            {
                //每回将一个窗口中的最大值压入结果集合
                //最大值永远是以队列头元素为下标的值
                res.push_back(num[q.front()]);
                
                //如果后面元素大小有比以队列中任何一个元素为下标的元素大的话
                //把队列清空
                while(!q.empty() && num[q.back()] <= num[i])
                    q.pop_back();
                
                //如果后面的元素没有比当前最大元素大,但是窗口已经满了,滑过了最大元素的下标
                if(!q.empty() && q.front() <= i-size)
                    q.pop_front();
                q.push_back(i);
            }
            //最后一次循环结束,i到头,最后一个窗口中的最大值就是
            //以队列中头元素为下标的值
            res.push_back(num[q.front()]);
        }
        return res;
    }
};
Sol
Publicado 253 artículos originales · elogiado 41 · 40,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/liuyuchen282828/article/details/104207382
Recomendado
Clasificación