剑指No.59-2_队列的最大值
- 题目:请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1
示例:输入:
[“MaxQueue”,“push_back”,“push_back”,“max_value”,“pop_front”,“max_value”]
[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2]
- 和上一题类似,使用双端队列做滑动窗口
/**
* @Description:
* 主要借助双端队列保存队列中的最大值,如果最大值出队列,辅助队列也出队列
* 如果不是当前最大值出队列,辅助队列不用出
* 在最大值之后进队的小值都会被保留,保证最大值出队后还能找到次小值
* 如果在之后进队一个更大的值,就把之前的小值全移除,因为这些小值必然在此最大值之前出队,在这之前最大值一直都是这个数
* @Author: chong
* @Data: 2021/5/31 6:51 下午
*/
public class MySolution {
Queue<Integer> queue;
Deque<Integer> deque;
public MySolution(){
queue = new LinkedList<>();
deque = new LinkedList<>();
}
public int max_value() {
return deque.isEmpty() ? -1 : deque.peekFirst();
}
public void push_back(int value) {
queue.add(value);
while (!deque.isEmpty() && deque.peekLast() < value)
deque.removeLast();
deque.addLast(value);
}
public int pop_front() {
if (queue.isEmpty())
return -1;
Integer poll = queue.poll();
if (poll.equals(deque.peekFirst()))
deque.removeFirst();
return poll;
}
}
- 这道题注意最后的
poll.equals(deque.peekFirst())
必须要用equals方法,因为poll和peekFirst()返回的值都是Integer类型,直接用"=="比较,比较的是内存地址,并且很具有迷惑性的是,由于Integer的缓存机制,在-128~127之间的值使用“==”比较得出的结果是正确的。
@Test
public void test(){
Integer a = 100;
Integer b = new Integer(100);
Integer c = Integer.valueOf(100);
System.out.println(a.equals(b));
System.out.println(a.equals(c));
System.out.println(b.equals(c));
System.out.println(a == c);
System.out.println(b == c);
Integer d = Integer.valueOf(200);
Integer e = 200;
System.out.println(d.equals(e));
System.out.println(d == e);
}
结果:
true
true
true
true
false
true
false