剑指Offer——I.滑动窗口的最大值(JS实现)

简介: 剑指Offer——I.滑动窗口的最大值(JS实现)

题目描述

image.png

解题思路一(暴力法)

  • 暴力法就是定义一个滑动窗口,然后通过循环不断地去移动这个窗口,直到窗口走到最后,然后分别求出每一个窗口的最大值,存到最终结果数组中,最后返回
  • 虽然通过暴力法也能够通过,但是还是希望能够找到更优解。

解题代码一(暴力法)

var maxSlidingWindow = function(nums, k) {
    // ! 方法一:暴力解法
    // 定义最终返回的结果数组
    if (k === 0) return [];
    const res = [];
    // 开始循环遍历
    for (let i = 0; i < nums.length - k + 1; i++) {
        let temp = nums.slice(i,i+k);
        res.push(Math.max(...temp));
    }
    return res;
};

解题思路二(双端队列)

  • 首先我们要清楚什么是双端队列,传统的队列的特点是先进先出,也就是只有一个出口,双端队列是既可以从队头出,也可以从队尾出
  • 我们构造一个双端队列,用来辅助我们判断滑动窗口的最大值
  • 我们首先定义左右指针,左右指针都是从零开始的,当左指针移动到nums.length - k的时候,说明遍历完了,此时结束while循环
  • 右指针是我们判断时的关键指针,当右指针元素大于队尾的时候,我们要将队尾元素出队,因为我们要构造的是一个降序排列的双端队列
  • 当队尾元素为空,或者队尾元素大于右指针指向的元素时,我们将右指针指向的元素入队
  • 当右指针-左指针 === k的时候,首先记录队首元素,这就是滑动窗口当前的最大值,同时说明滑动窗口的长度已经大于k了,此时判断队首元素是否是左指针指向的元素,如果是的,将这个元素从队头去掉,然后左指针+1

解题代码二(双端队列)

var maxSlidingWindow = function(nums, k) {
    // ! 方法一:双端队列
    // 定义最终返回的结果数组
    if (k === 0) return [];
    const res = [];
    // 定义双端队列
    const doubleQueue = [];
    // 定义左右指针
    let left = 0;
    let right = 0;
    // 当左指针移动到nums.length - k即可结束循环
    while (left <= nums.length - k) {
        if (doubleQueue.length > k) doubleQueue.shift();
        // 如果滑动窗口的长度超过了k值,则将left向右移动一个,并将此时的双端队列的队头元素出队
        if (right - left === k) {
            res.push(doubleQueue[0]);
            if (nums[left] === doubleQueue[0]) {
                doubleQueue.shift();
            }
            left++;
            continue;
        }
        // 如果双端队列为空,则将right指针指向的数字加入队列
        if (doubleQueue.length === 0) {
            doubleQueue.push(nums[right]);
            right++;
            continue;
        }
        if (nums[right] <= doubleQueue[doubleQueue.length - 1]) {
            doubleQueue.push(nums[right]);
            right++;
            continue;
        }
        while (nums[right] > doubleQueue[doubleQueue.length - 1]) {
            if (doubleQueue.length === 0) {
                doubleQueue.push(nums[right]);
                right++;
            } else {
                doubleQueue.pop();
            }
        }
    }
    return res;
};

总结(本题给我们的启示思路)

  • 启示一:学会使用双端队列的方法来判断滑动窗口的最大值
相关文章
|
3月前
|
存储 JSON JavaScript
「offer来了」保姆级巩固你的js知识体系(4.0w字)
该文章提供了JavaScript知识体系的全面复习资料,覆盖了从基础语法到高级特性如闭包、原型链、异步编程等多个方面,并通过大量的面试题和实例代码帮助巩固理解。
「offer来了」保姆级巩固你的js知识体系(4.0w字)
|
7月前
|
JavaScript 前端开发
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
|
7月前
|
JavaScript 前端开发
JavaScript题解剑指offer : 09. 用两个栈实现队列
JavaScript题解剑指offer : 09. 用两个栈实现队列
46 0
|
算法 JavaScript
W3Cschool编程实战JS脚本算法挑战:寻找数组中的最大值算法挑战
在右边的大数组中包含了4个小数组,请分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新的数组。
87 0
|
JavaScript
js中对进制、最大值、最小值,无穷大小及其NaN的初步认识
js中对进制、最大值、最小值,无穷大小及其NaN的初步认识
|
JavaScript
js获取数组中最大值
js获取数组中最大值
79 0
|
JavaScript 前端开发 程序员
《剑指 Offer(第 2 版)》树部分JavaScript题解
《剑指 Offer(第 2 版)》树部分JavaScript题解
《剑指 Offer(第 2 版)》树部分JavaScript题解
|
存储 JavaScript 前端开发
《剑指 Offer (第 2 版)》链表部分 JavaScript 题解
《剑指 Offer (第 2 版)》链表部分 JavaScript 题解
《剑指 Offer (第 2 版)》链表部分 JavaScript 题解
|
JavaScript 算法 前端开发
【前端算法】JS实现数字千分位格式化
JS实现数字千分位格式化的几种思路,以及它们之间的性能比较
355 1
|
存储 前端开发 算法
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
165 0
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法