[原题链接](https://leetcode-cn.com/problems/sliding-window-maximum/solution/qian-duan-shi-tang-ti-jie-chao-hao-li-ji-brwq/) ## 单调队列 1.维护一个单调递减队列,从大到小,左边是出口,右边是入口 2.每次 pop 时需要判断当前队列是否为空,并且如果当前要弹出的数值等于队列出口元素时,队列移除出口元素 3.每次 push 的元素如果大于入口元素,将队列后端的数值弹出,直到 push 的元素数值小于队列入口元素,保证单调性 4.max 可以获取当前队列的最大值 ```javascript const maxSlidingWindow = function(nums, k) { const n = nums.length class slideWindow { constructor() { this.data = [] } push(val) { let data = this.data while (data.length > 0 && data[data.length - 1] < val) { data.pop() } data.push(val) } pop(val) { let data = this.data if (data.length > 0 && data[0] === val) { data.shift() } } max() { return this.data[0] } } let res = [] let windows = new slideWindow() for (let i = 0; i < n; i++) { if (i < k - 1) { windows.push(nums[i]) } else { windows.push(nums[i]) res.push(windows.max()) windows.pop(nums[i - k + 1]) } } return res } ``` - 时间复杂度:O(n) - 空间复杂度:O(n)
Activity