这道题的思路和上一道题类似,我的思路:
1 push时,值大于最大值,则将最大值队列清除,之后将这个值加入最大队列队尾,值小于最大值,则从队列队尾开始,将值小于这个值的数据删除,然后将这个值加入最大队列队尾。
2 pop时,值等于最大值,将最大值队列中的最大值删除。
思路主要参考了队列的特点,队列与窗口的不同之处:
窗口的pop和push同时发生,每次发生两个操作,使得窗口长度不变;队列pop,push分别发生。
代码实现:
实现涉及到对于Queue和Deque的操作,不熟悉。答案的代码很简洁。
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);
我的代码
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;
}
}
答案代码
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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。