双端队列Deque
ArrayDeque是继承自Deque接口,Deque继承自Queue接口,Queue是队列,而Deque是双端队列,也就是可以从前或者从后插入或者取出元素,也就是比队列存取更加方便一点,单向队列只能从一头插入,从另一头取出。
ArrayDeque常用方法:
题目一:滑动窗口的最大值
思路:
这个题目用到了双端队列,熟悉了双端队列的操作,在存入一个数字的下标之前,首先判断队列中的数字是否小于现在的值,如果小于的话,它们将依次从窗口中滑出。当一个数字的下标与当前处理的数字下标之差大于等于活动窗口时,这个数字已经从窗口滑出,可以从队列中删除了。如果队列头部的数字已经从窗口滑出,那么滑出的数字也需要从队列的头部删除。
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