剑指offer_59_队列的最大值I(滑动窗口的最大值)【javascript】

89 阅读1分钟

题目链接

leetcode.cn/problems/hu…

题目(困难)

给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。

例如,如果输入数组 nums = [1,3,-1,-3,5,3,6,7] 和滑动窗口的大小 k = 3,那么一共存在 6 个滑动窗口,它们的最大值分别为 [3,3,5,5,6,7]

示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]

示例 2:
输入:nums = [1], k = 1
输出:[1]

提示:

题解

单调栈(减)

复杂度分析:

  • 时间复杂度为:O(N)
  • 空间复杂度为:O(N)
var maxSlidingWindow = function(nums, k) {
  let res = [];
  let stack = []; // 存放下标
  for (let i = 0; i < nums.length; i++) {
    if (i - stack[0] >= k) { //在滑动窗口之外的直接从队头删掉
      stack.shift();
    }
    while (stack.length > 0 && nums[stack[stack.length - 1]] < nums[i]) {
      stack.pop(); // 栈顶元素小于当前元素,栈顶元素出栈, 维持栈底元素最大
    }
    stack.push(i); // 存储索引
    if (i + 1 >= k) {  // 开始存结果
         res.push(nums[stack[0]]); // 获取栈底元素
     }
  }
  return res;
};