剑指offer面试题59-2:队列的最大值

这道题的思路和上一道题类似,我的思路:

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/qq_40473204/article/details/115345817