LeetCode剑指offer59 - ||: 队列最大值
- 最初思路:维护一个最大值记录数MAX,每当新的数加入队列时更新这个记录器
结果发现,当最大值被取出后,没法找到下一个最大值。。。
public int pop_front() {
if(queue.size()==0)return -1;
int res = queue.removeFirst();
if(res == MAX&&count==1){
//怎么找下一个最大值???
}
return res;
}
-
这时想到了之前做过的单调栈,但是觉得可能不用增加空间,想不出来怎么实现,就去看题解了
-
结果题解的思路还是用了一个辅助队列。于是自己再构思一下思路:
需要一个辅助队列,队头能立马获取最大值;
从队头到队尾必须是非递增的。否则某次取出队头时就不是最大值了;
那么怎么让新加到队尾的比之前的队尾小?
想一小会。。。。
简单啊,反正你不是用来保存我的真实数据的,那比新队尾大的直接扔掉不就好了吗!
正所谓弱肉强食,要把比自己弱的都踢掉(bushi)
好耶,又解决了,我真棒 -
等会,怎么把原来的队尾除掉??不是只能从队头除掉吗??记得还有双端队列这玩意,不过我查了一下,我用的linedlist中就有类似双端队列的方法。大功告成
-
完整代码
class MaxQueue {
private Deque<Integer>queue;
private LinkedList<Integer>fuzhu;//辅助单调队列,记录最大值
public MaxQueue() {
queue=new LinkedList<>();
fuzhu=new LinkedList<>();
}
public int max_value() {
if(queue.size()==0)return -1;
return fuzhu.getFirst();
}
public void push_back(int value) {
queue.addLast(value);
//辅助队列,一直把小于value的都踢掉
//等于的不用踢,出队时再一个个踢
while((!fuzhu.isEmpty())&&value>fuzhu.getLast()){
fuzhu.removeLast();
}
fuzhu.addLast(value);
}
public int pop_front() {
if(queue.size()==0)return -1;
int res = queue.removeFirst();
//数据队列最大值走了,辅助队列也要走
//两个队列重复数的情况也相同
if(res == fuzhu.getFirst())fuzhu.removeFirst();
return res;
}
}