考察的数据结构-队列
题目描述
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
JavaScript 实现
/**
* 考察队列
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var maxSlidingWindow = function(nums, k) {
// 存储 k 个数字的滑动窗口队列
const queue = []
// 存储滑动窗口的最大值数组
const res = []
// 遍历先找出前k个窗口要存储的值索引
for (let i = 0; i < k; i++) {
// 如果队列中的尾值小于当前即将插入的值,就删除掉
while(queue.length && nums[queue[queue.length - 1]] < nums[i]) {
queue.pop()
}
// 从队尾插入元素索引
queue.push(i)
}
// 存储窗口最大值的第一项
res[0] = [nums[queue[0]]]
// 每次移动一位开始遍历
for (let i = k ; i < nums.length; i++) {
// 当前值比队列的尾值大就删除
while(queue.length && nums[i] >= nums[queue[queue.length - 1]] ) {
queue.pop()
}
// 当前值小,就直接在尾部添加
queue.push(i)
// 从队首开始删除不在滑动窗口内的
while(queue[0] <= i - k) {
queue.shift()
}
// 添加最大值
res.push(nums[queue[0]])
}
return res;
};
实现过程
- 滑动窗口队列中对首保持最大值,每次从队尾添加,比它小就入栈(push),比它大就从队尾遍历删除(pop)
- 注意滑动窗口要保持个数不能超过指定的 k 项