La aplicación de colas monótonas: la espada se refiere a la Oferta 59 - II El valor máximo de la cola cola doble (con imágenes y textos) guía detallada paso a paso

información del tema

请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。

若队列为空,pop_front 和 max_value 需要返回 -1


Muestra

Ejemplo 1:
输入: 
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2]
Ejemplo 2:
示例 2:

输入: 
["MaxQueue","pop_front","max_value"]
[[],[],[]]
输出: [null,-1,-1]

factor de limitación

限制:

1 <= push_back,pop_front,max_value的总操作数 <= 10000
1 <= value <= 10^5

Ideas:

El título requiere que la complejidad del tiempo amortizado de inserción, eliminación y valor máximo sean todos O(1). La inserción y la eliminación son simples. La clave es cómo encontrar la complejidad de tiempo máxima de O(1). Si es violento, debe atravesar los elementos de la cola una vez para encontrar el valor máximo, y la complejidad de tiempo de eso es O(n).

A continuación, utilicé la práctica de cambiar el espacio por el tiempo e introduje una cola de dos extremos para ayudar a encontrar el valor máximo.

inserte la descripción de la imagen aquí

接下来用一组数据举一个例子:3 4  1  5

Paso 1:

inserte la descripción de la imagen aquí

Paso 2:

inserte la descripción de la imagen aquí

Paso 3:

inserte la descripción de la imagen aquí

Paso 4:

inserte la descripción de la imagen aquí

Resumir:

Al insertar, se puede encontrar que el máximo en cualquier momento se puede obtener directamente en la cabeza de la cola doble, por lo que se realiza la complejidad de tiempo O(1) para el máximo.

Código

A continuación, echemos un vistazo al código de la implementación específica. No es fácil de hacer. Si lo entiende, ¿por qué no darle un enlace de tres?

class MaxQueue {
    
    
    //q是普通队列,d是双端队列
Queue<Integer> q;
Deque<Integer> d;

    public MaxQueue() {
    
    
        //初始化
        
        q=new LinkedList<> ();
        d=new LinkedList<> ();
    }

    public int max_value() {
    
    
        //如果双端队列为空返回-1,不然就返回双端队列的队头元素
        if(d.isEmpty ()){
    
    
            return -1;
        }
        return  d.peekFirst ();
    }

    public void push_back(int value) {
    
    
        //当双端队列不为空并且它的队尾元素<待插入元素时,将队头元素出队列
        while (!d.isEmpty () && d.peekLast ()<value){
    
    
            d.pollLast ();
        }
        //两个条件有一个不满足的话,正常插入
        d.offerFirst (value);
        q.offer (value);
    }

    public int pop_front() {
    
    
        //普通队列为空返回-1
        if (q.isEmpty ()){
    
    
            return  -1;
        }
        //先获取普通队列的队头,如果队头和双端队列的队列相等的话,那么双端队列的队列也要出队列。
        int ans=q.poll ();
        if(ans==d.peekFirst ()){
    
    
            d.pollFirst ();
        }
        return  ans;
    }
}

Supongo que te gusta

Origin blog.csdn.net/guankunkunwd/article/details/122619518
Recomendado
Clasificación