JavaScript日拱算法题解滑动窗口的最大值示例

目录
  • 题目:
  • 题解:
    • 第一反应
      • JavaScript 实现
    • 第二反应
      • JS 实现
  • 小结:

题目:

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

示例:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
  滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

题目来源:剑指 Offer 59 - I. 滑动窗口的最大值

题解:

第一反应

有时候搞不太懂力扣对于难度等级的判定,此题为“困难”?

用长度为 k 的数组去遍历 nums 就可以了,每次拿到它的最大值,然后push进结果数组中,再返回不就行了?

分步解析:

1.找到窗口从头滑到尾需要滑动的次数为: nums.length - k + 1;

2.初始化队列;

3.每次滑动的时候,找到当前窗口的最大值保存到 res 数组,然后执行删除队列头元素、在队列尾添加下一元素的操作;

JavaScript 实现

var maxSlidingWindow = function(nums, k) {
    if (nums.length == 0 || k > nums.length) return []
    var index = k
    var len = nums.length - k + 1
    var stack = [], res = []
    for (var j = 0; j < k; j++) {
        stack.push(nums[j])
    }
    for (i = 0; i < len; i++) {
        if (i !== 0) {
            stack.shift()
            stack.push(nums[index])
            index++
        }
        res.push(Math.max.apply(null, stack))
    }
    return res
};

提交看看,结果报错“超出时间限制” QAQ

噢噢,再回看算法,for 循环里面要对数组一整个 Math.max,时间复杂度肯定爆表了,O(n*n),不超时才怪。

第二反应

正解:转换思路 采用单调数列

依次将数组的下标push到窗口中,超出窗口的shift掉,窗口是个单调递减队列,队头元素就是当前窗口的最大值;

步骤拆解:

1、每当读入的数大于队尾,则循环删除队尾小于读入元素的数字,保证队列的递减单调性

2、如果单调的队首(极大值),等于窗口左边界的上一位,则说明极大值已经超出窗口,移除单调递减队列的队首

3、每次窗口滑动的最大值为,单调递减队列的队首

4、循环以上步骤,直到窗口的右边界到队尾

JS 实现

var maxSlidingWindow = function(nums, k) {
     const res = []; //保存滑动窗口的最大值
    const q = []; //滑动窗口队列
    for (let i = 0; i < nums.length; i++) {
        //1.在队尾添加元素num[i]
        var last = q.length - 1; //队列的最后一个元素的索引
        while (last >= 0 && nums[i] > q[last]) { //2.循环求解序列中的最大值
            //2.求队列中的最大值:如果新入队列的元素,比队尾元素大,队尾被更新成新入队列的元素,保证队头为队列中的最大元素
            q.pop(); //队尾移除,
            last = q.length - 1; //队列更新长度
        }
        q.push(nums[i]); //入队列
        // 当窗口i + 1 - k >= 0时,窗口满了有三个数了
        const j = i + 1 - k;     //窗口向右滑动过程中最后一个元素的索引。
        if (j >= 0) {
            res.push(q[0]); //保存每一次k个窗口的最大值
            if (nums[j] === q[0]) { //3.向有滑动过程中,如果序列中的最大元素即退出窗口,则移除队列头部元素
                q.shift(); //
            }
        }
    }
    return res;
};

小结:

除了以上两种解法,还有其它思路,不得不说这题还是很有学问的。在处理滑动窗口问题中,经常会遇到要构造一个单调队列,得着重记笔记记笔记。(ಥ﹏ಥ)

以上就是JavaScript日拱算法题解滑动窗口的最大值示例的详细内容,更多关于JavaScript 滑动窗口最大值的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java C++分别实现滑动窗口的最大值

    目录 1.题目 2.思路 3.c++代码 4.java代码 1.题目 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 提示: 你可以假设 k 总是有效的,在输入数组不为空的情况下,1 ≤ k ≤ 输入数组的大小. 2.思路 (单调队列) O(n) 给定一个数组 nums 和滑动窗口的大小 k,让我们找出所有滑动窗口里的最大值. 样例: 如样例所示,nums = [1,3,-1,-3,5,3,6,7],k = 3,我们输出[3,3,5,5,6,7]. 首先,我

  • Java 滑动窗口最大值的实现

    一.题目 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 二.单调队列解析 题目让求随着滑动窗口的滑动,返回窗口覆盖范围的最大值 该题不适合优先级队列,因为采用大顶堆存放k个数字,可以知道此时的最大值,但是窗口是滑动的,大顶堆每次只能弹出最大值,无法移除其他值,即无法用大顶堆维护滑动窗口里的值. 所以采用队列维护,随着窗口的移动,队列先进先出 此时对队列的要求

  • JavaScript前端学算法题解LeetCode最大重复子字符串

    目录 最大重复子字符串 解题思路 知识点 这是LeetCode的第1668题:最大重复子字符串 最大重复子字符串 给你一个字符串 sequence ,如果字符串 word 连续重复 k 次形成的字符串是 sequence 的一个子字符串,那么单词 word 的 重复值为 k .单词 word 的 最大重复值 是单词 word 在 sequence 中最大的重复值.如果 word 不是 sequence 的子串,那么重复值 k 为 0 .给你一个字符串 sequence 和 word ,请你返回

  • JavaScript日拱算法题解滑动窗口的最大值示例

    目录 题目: 题解: 第一反应 JavaScript 实现 第二反应 JS 实现 小结: 题目: 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6

  • 前端算法题解leetcode36-有效的数独示例

    目录 题目 解题思路-分别处理 代码实现 解题思路-一次扫描判断所有 代码实现 题目 题目地址 请你判断一个 9 x 9 的数独是否有效.只需要 根据以下规则 ,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次.(请参考示例图) 注意: 一个有效的数独(部分已被填充)不一定是可解的. 只需要根据以上规则,验证已经填入的数字是否有效即可. 空白格用 '.' 表示. 示例 1:

  • ASP.NET Core中使用滑动窗口限流的问题及场景分析

    目录 算法原理 漏检 太刚 算法实现 进程内即内存滑动窗口算法 基于Redis的滑动窗口算法 应用算法 1.安装Nuget包 2.使用中间件 滑动窗口算法用于应对请求在时间周期中分布不均匀的情况,能够更精确的应对流量变化,比较著名的应用场景就是TCP协议的流量控制,不过今天要说的是服务限流场景中的应用. 算法原理 这里假设业务需要每秒钟限流100次,先来看固定窗口算法的两个问题: 漏检 如下图所示,单看第1秒和第2秒,其请求次数都没有超过100,所以使用固定窗口算法时不会触发限流.但是第1秒的后

  • redis zset实现滑动窗口限流的代码

    目录 限流 rediszset特性 滑动窗口算法 java代码实现 补充:RediszSet实现滑动窗口对短信进行防刷限流 前言 示例代码 限流 需求背景:同一用户1分钟内登录失败次数超过3次,页面添加验证码登录验证,也即是限流的思想. 常见的限流算法:固定窗口计数器:滑动窗口计数器:漏桶:令牌桶.本篇选择的滑动窗口计数器 redis zset特性 Redis 有序集合(sorted set)和集合(set)一样也是 string 类型元素的集合,且不允许重复的成员.不同的是每个元素都会关联一个

  • JavaScript多种滤镜算法实现代码实例

    这篇文章主要介绍了JavaScript多种滤镜算法实现代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.灰色滤镜 设定R,G,B值相等 function makeGray(img){ for(var pixel of img.values()){ var avg = (pixel.getRed()+pixel.getGreen()+pixel.getBlue())/3; pixel.setRed(avg); pixel.setGree

  • jQuery实现仿微软首页感应鼠标变化滑动窗口效果

    本文实例讲述了jQuery实现仿微软首页感应鼠标变化滑动窗口效果.分享给大家供大家参考.具体如下: 这是一款jQuery仿微软首页感应鼠标变化的滑动窗口,鼠标放上后,窗口会向左拉长,鼠标移走后恢复原样,是在微软官方网站发现的,看了看代码,觉得很容易就扣下来,不敢独享. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-f-microsoft-web-nav-demo/ 具体代码如下: <!DOCTYPE html PUBLIC "

  • 分享几道和「滑动窗口」有关的算法面试题

    前言科普:什么是滑动窗口算法 滑动问题包含一个滑动窗口,它是一个运行在一个大数组上的子列表,该数组是一个底层元素集合. 假设有数组 [a b c d e f g h ],一个大小为 3 的 滑动窗口 在其上滑动,则有: [a b c] [b c d] [c d e] [d e f] [e f g] [f g h] 一般情况下就是使用这个窗口在数组的 合法区间 内进行滑动,同时 动态地 记录一些有用的数据,很多情况下,能够极大地提高算法地效率. 1. 滑动窗口最大值 题目来源于 LeetCode

随机推荐