这题开始学习单调队列了,看助教讲解的比较麻烦,分开写了,然后去听了船长讲的单调队列的基础知识,返现好理解一点儿,然后看了题解,高阅读量的几篇,都是跟船长的思路一样,所以找了一个相对好理解,跟船长思路最相思的,先撸了一遍代码
/*
* @lc app=leetcode.cn id=239 lang=javascript
*
* [239] 滑动窗口最大值
*/
// @lc code=start
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var maxSlidingWindow = function (nums, k) {
// 记录数组元素下标 方便取值
const q = [];
// 答案
const ans = []
for (let i = 0; i < nums.length; i++) {
//维护单调性 如果q不为空 并且q后面的元素比当前元素小 则弹出
// 例如最小值 3 1 4 5 2 刚开始队列是1 4 后面2要进去 但是4比2大 所以所以出来 本题最大值刚好相反
while (q.length && nums[i] >= nums[q[q.length - 1]]) {
q.pop()
}
q.push(i);
//出队 判断出队 出队只能从前边出最后一个 也就是q[0]值不在当前窗口范围
while (q[0] <= i - k) {
q.shift()
}
// 也可以说是 i + 1 > k 对头就是最大值
// 比如本题k = 3 i为2时第一个组下标 0 到 2 这3个值 也就是 2+1 - 0 = 3 中最大的值
// 不太理解这儿 不能i==k-1
if (i >= k - 1) {
ans.push(nums[q[0]])
}
}
return ans
};
// @lc code=end