思路:这里构造了一个双向列表,一个一个把数据插入到队列中,如果当前插入的数据小于队尾的值,直接插入;如果当前的数大于队尾的值,把队尾的值弹出后直到队尾的数不再小于当前的值再插入,这样得到的一个队列实际上就是一个按从大到小顺序排列的队列,在把队头最大的值放入结果中时还应该考虑当前队头的值在不在滑动窗口内,如果不在就弹出。为了判断这里的队头的值在不在滑动列表中,这里queue存储的是nums中的下标。
var maxSlidingWindow = function(nums, k) {
var queue=[],result=[];//定义一个双向链表和一个储存结果的数组
for(let i=0;i<nums.length;i++){
while(queue.length!=0&&nums[queue[queue.length-1]]<=nums[i]){//当队列不为空,且队尾的值小于当前要插入的值时,把队尾的数弹出
queue.pop();
}
//因为小于当前数的值都弹出了,所以当前值插在队尾就是最小值
queue.push(i);
//如果队头的值不在当前的滑动窗口内,就把队头的值弹出
if(queue[0]<=i-k){
queue.shift();
}
//当可以构成一个滑动窗口时,把对头的值存入结果中
if(i+1 >= k){
result[i+1-k] = nums[queue[0]];
}}
return result;
};