题解 | #滑动窗口的最大值#
滑动窗口的最大值
https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788
/**
* 主要是运用的Deque双向队列 , 双向队列中的元素降序排列 。每次添加进入的元素都要进行判断,如果大于队尾的元
*素,就删除队尾的元素 ,直到找到一个大于该元素的元素 或者队列为空时 将该元素添加至队尾,用begin记录头元素的
* 下标 ,当头元素下标 + size < i 时 队头元素失效 ,pop出对头元素。当 i+1>= 5时窗口形成,每次都将对头元素加入 集合中 。
*/
import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size) {
if(num.length < size || size < 1 || num.length == 0 ) return new ArrayList<Integer>();
ArrayList<Integer> list = new ArrayList<>();
//主要是保证deque中的元素是降序排列
ArrayDeque<Integer> deque = new ArrayDeque<>();
int begin = -1;
for(int i = 0 ; i < num.length ; i++){
while(!deque.isEmpty() && deque.getLast() < num[i]){
//将deque中小于当前元素的值舍弃
deque.pollLast();
}
//将当前元素加入deque中
deque.add(num[i]);
if(deque.size() == 1) begin = i; //记录新的头部的位置
//判断deque头部元素是否过期
if(begin + size <= i){
deque.pollFirst();
}
//判断窗口是否形成 形成则返回队首元素
if(i+1 >= size)
{
list.add(deque.peekFirst());
}
}
return list;
}
}

