双端队列解决窗口滑动问题

package queue;

import java.util.ArrayDeque;
import java.util.Deque;

class SildeWindow{

public int[] getMax(Integer[] data,int window ) {
Deque<Integer> deque=new ArrayDeque<Integer>();
int[] res=new int[data.length-window+1];//res记录窗口的最大值
int j=0; //res的下标
//遍历数组
for(int i=0;i<data.length;i++) {
//第一个窗口入队w-1个数
if(i<window-1){
deque.push(i);
}else {
//窗口的最后一个数据(还没还有入队),比队尾(first端)元素大,让队尾出队
while(!deque.isEmpty()&&data[i]>data[deque.peekFirst()]) {
deque.pollLast();
}
//判断队列头(last端)元素是否过期(即在窗口外面),如果过期就出队
if(!deque.isEmpty()&&deque.peekLast()<i+1-window) {
deque.pollLast();
}
//以上操作之后 让窗口的最后一个数据入队
deque.push(i);
//此时队列的last是窗口最大值
res[j++]=data[deque.peekLast()];
}
}
return res;
}
}
public class MoveWindow {

public static void main(String[] args) {
Integer[] data=new Integer[] {4,3,5,4,3,3,6,7};
int window=3;
SildeWindow sw=new SildeWindow();
int[] res=sw.getMax(data,window);
for(int i:res) {
System.out.println(i);
}
}

}

posted @ 2018-04-24 23:46  特仑苏灬  阅读(274)  评论(0编辑  收藏  举报