La idea de esta pregunta es similar a la anterior, mi idea:
1 Al presionar, el valor es mayor que el valor máximo, la cola de valor máximo se borra y luego este valor se agrega al final de la cola máxima, y el valor es menor que el valor máximo, comenzando desde el final de la cola, los datos cuyo valor es menor que este valor se eliminan, y luego este valor se agrega al final de la cola máxima.
2 Cuando aparece, el valor es igual al valor máximo y se elimina el valor máximo en la cola de valores máximos.
La idea se refiere principalmente a las características de la cola, la diferencia entre la cola y la ventana:
El pop y el push de la ventana ocurren al mismo tiempo, y dos operaciones ocurren cada vez, de modo que la longitud de la ventana permanece sin cambios; el pop y el push de la cola ocurren por separado.
Código:
La implementación implica la operación de Queue y Deque, que no es familiar. El código de la respuesta es muy conciso.
Deque<Integer> deque = new LinkedList();
Queue<Integer> queue = new LinkedList();
deque.size()
res = deque.peekLast();
deque.removeLast();
deque.addLast(value);
deque.peekFirst()
deque.removeFirst();
deque.addFirst(value);
Mi código
class MaxQueue {
Deque<Integer> deque = new LinkedList();
Queue<Integer> queue = new LinkedList();
public MaxQueue() {
}
public int max_value() {
int res = -1;
if(deque.size() > 0){
res = deque.peekLast();
}
return res;
}
public void push_back(int value) {
if(queue.size() >0){
queue.add(value);
if(value > deque.peekLast()){
while(deque.size()!=0){
deque.removeLast();
}
deque.addLast(value);
}else{
while(deque.size()!=0){
if(value > deque.peekFirst()){
deque.removeFirst();
}else{
break;
}
}
deque.addFirst(value);
}
}else{
queue.add(value);
deque.addLast(value);
}
}
public int pop_front() {
int quepop = -1;
if(queue.size() >0){
quepop = queue.remove();
if(quepop == deque.peekLast()){
while(deque.size()!=0){
if(deque.peekLast()==quepop){
deque.removeLast();
}else{
break;
}
}
}else{
}
}else{
return -1;
}
return quepop;
}
}
Código de respuesta
class MaxQueue {
Queue<Integer> q;
Deque<Integer> d;
public MaxQueue() {
q = new LinkedList<Integer>();
d = new LinkedList<Integer>();
}
public int max_value() {
if (d.isEmpty()) {
return -1;
}
return d.peekFirst();
}
public void push_back(int value) {
while (!d.isEmpty() && d.peekLast() < value) {
d.pollLast();
}
d.offerLast(value);
q.offer(value);
}
public int pop_front() {
if (q.isEmpty()) {
return -1;
}
int ans = q.poll();
if (ans == d.peekFirst()) {
d.pollFirst();
}
return ans;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/solution/mian-shi-ti-59-ii-dui-lie-de-zui-da-zhi-by-leetcod/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。