面试题59:队列的最大值

文章目录

      • 双端队列Deque
      • 题目一:滑动窗口的最大值
      • 题目二:队列的最大值

双端队列Deque

面试题59:队列的最大值_第1张图片
 ArrayDeque是继承自Deque接口,Deque继承自Queue接口,Queue是队列,而Deque是双端队列,也就是可以从前或者从后插入或者取出元素,也就是比队列存取更加方便一点,单向队列只能从一头插入,从另一头取出。
ArrayDeque常用方法:
面试题59:队列的最大值_第2张图片

题目一:滑动窗口的最大值

在这里插入图片描述
思路:
 这个题目用到了双端队列,熟悉了双端队列的操作,在存入一个数字的下标之前,首先判断队列中的数字是否小于现在的值,如果小于的话,它们将依次从窗口中滑出。当一个数字的下标与当前处理的数字下标之差大于等于活动窗口时,这个数字已经从窗口滑出,可以从队列中删除了。如果队列头部的数字已经从窗口滑出,那么滑出的数字也需要从队列的头部删除。



import java.util.*;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        ArrayList<Integer> list=new ArrayList<>();
        if(num==null||size<=0||num.length<size){
            return list;
        }

      Deque<Integer> que=new LinkedList<>();
        for(int i=0;i<num.length;i++){
            while(!que.isEmpty()&&num[i]>=num[que.getLast()]){
                que.pollLast();
            }
            que.addLast(i);
            //判断是否过期
            if(i-que.getFirst()==size){
                que.pollFirst();
            }
            if(i>=size-1){
                list.add(num[que.getFirst()]);
            }
        }
        return list;

    }
}

题目二:队列的最大值

在这里插入图片描述
思路:
 分别定义两个双端队列,一个存数据,一个存最大值,还需要存储一种数据结构,存下标和对应的值。

public class QueueWithMax {
    private class InternalData{
        int number;
        int index;
        public InternalData(int number,int index){
            this.index=index;
            this.number=number;


        }
    }
    Deque<InternalData> data=new ArrayDeque<>();
    Deque<InternalData> maxdata=new ArrayDeque<>();
    private int curIndex;
    public void push_back(int number){
        InternalData curdata=new InternalData(number,curIndex);
        data.addLast(curdata);
        while(!maxdata.isEmpty()&&maxdata.getLast().number<number){
            maxdata.removeLast();
        }
        maxdata.addLast(curdata);
        curIndex++;

    }
    public void pop_front(){
        if(data.isEmpty()){
            System.out.println("队列为空,没有元素可以出队列");
            return;
        }
        InternalData curdata=data.removeFirst();
        if(curdata.index==maxdata.getFirst().index){
            maxdata.removeFirst();
        }
    }
    public int max(){
        if(maxdata.isEmpty()){
            System.out.println("队列为空,没有最大值");
            return -1;
        }
        return maxdata.getFirst().number;
    }

    public static void main(String[] args) {
        QueueWithMax qtm=new QueueWithMax();
        qtm.push_back(1);
        //true
        System.out.println(qtm.max()==1);
        qtm.push_back(2);
        qtm.push_back(3);
        //true
        System.out.println(qtm.max()==3);
        qtm.pop_front();
        qtm.pop_front();
        //true;
        System.out.println(qtm.max()==3);
    }

}

参考:https://www.cnblogs.com/mfrank/p/9600137.html

你可能感兴趣的:(刷题)