剣はオファーインタビューの質問59-2を参照しています:キューの最大値

この質問のアイデアは、前の質問、私のアイデアと似ています:

1プッシュすると、値が最大値より大きくなり、最大値キューがクリアされてから、この値が最大キューの最後に追加され、値が最大値より小さくなります。キュー、この値よりも小さい値のデータが削除され、次にこの値が最大キューの最後に追加されます。

2 popの場合、値は最大値と等しくなり、最大値キューの最大値が削除されます。

このアイデアは、主にキューの特性、キューとウィンドウの違いに言及しています。

ウィンドウのポップとプッシュは同時に発生し、毎回2つの操作が発生するため、ウィンドウの長さは変わりません。キューのポップとプッシュは別々に発生します。

 

コード:

実装には、なじみのない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