js(95)~239. 滑动窗口最大值-单调队列

326 阅读1分钟

力扣本题传送门

image.png

这题开始学习单调队列了,看助教讲解的比较麻烦,分开写了,然后去听了船长讲的单调队列的基础知识,返现好理解一点儿,然后看了题解,高阅读量的几篇,都是跟船长的思路一样,所以找了一个相对好理解,跟船长思路最相思的,先撸了一遍代码

/*
 * @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