首页 > 其他分享 >239. 滑动窗口最大值(难)

239. 滑动窗口最大值(难)

时间:2024-10-30 14:31:00浏览次数:5  
标签:deque 窗口 nums 最大值 元素 239 数组 滑动

目录

题目

  • 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。

法一、暴力枚举

  • 遍历数组,获取每个窗口的子数组,找到当前窗口的最大值并加入结果数组
var maxSlidingWindow = function(nums, k) {
    let res = [];
    for (let i = 0; i <= nums.length - k; i++) {
        // 获取当前窗口的子数组
        let window = nums.slice(i, i + k);
        // 找到当前窗口的最大值
        let maxVal = Math.max(...window);
        // 将最大值加入结果数组
        res.push(maxVal);
    }
    return res;
};
  • 超出时间限制

法二、双端队列

  • 思路:挨个遍历数组,用一个双端队列往对列右边加入,如果对列中存在比当前元素小的就左边弹出,如果超过了滑动窗口的范围也缩小左边 ,每到滑动窗口的大小时就将最大值(第一个元素)放进结果数组。
var maxSlidingWindow = function(nums, k) {

    let res = [];
    let deque = []; // 用于存储当前窗口内有用元素的索引

    for (let i = 0; i < nums.length; i++) {
        // 移除不在窗口内的元素:确保窗口大小不超过k
        if (deque.length && deque[0] < i - k + 1) {
            deque.shift();//删除数组第一个元素
        }
        // 移除小于当前元素的元素索引
        while (deque.length && nums[deque[deque.length - 1]] < nums[i]) {
            deque.pop();//删除数组的最后一位
        }
        // 将当前元素索引加入到 deque
        deque.push(i);//向数组尾部添加
        // 从第 k-1 个元素开始,添加当前窗口的最大值到结果数组
        if (i >= k - 1) {
            res.push(nums[deque[0]]);//最后的对列是单调的,第一个元素是最大的
        }
    }
    return res;
};

标签:deque,窗口,nums,最大值,元素,239,数组,滑动
From: https://www.cnblogs.com/lushuang55/p/18515169

相关文章

  • Unity 滑动条 SlideView
    usingUnityEngine;usingSystem.Collections;usingUnityEngine.UI;publicclassSlideView:MonoBehaviour{publicSliderslide;publicScrollbarsb;//UsethisforinitializationvoidStart(){if(transform.name=="Sc......
  • 算法的学习笔记—滑动窗口的最大值(牛客JZ59)
    ......
  • 代码随想录算法训练营第十一天|leetcode150. 逆波兰表达式求值、leetcode239. 滑动窗
    1leetcode150.逆波兰表达式求值题目链接:150.逆波兰表达式求值-力扣(LeetCode)文章链接:代码随想录视频链接:栈的最后表演!|LeetCode:150.逆波兰表达式求值_哔哩哔哩_bilibili自己的思路:这是一道有思路,但是思路并不多的题目,就是我会觉得是先将数据进行添加,然后对于符号通过倒......
  • 滑动窗口与双指针
    1.定长滑动窗口套路参考:灵神的总结入-更新-出:入:下标为i的元素进入窗口,更新相关统计量。如果i<k−1则重复第一步。更新:更新答案。一般是更新最大值/最小值。出:下标为i−k+1的元素离开窗口,更新相关统计量。for(inti=0;i<nums.size();++i){//1.进入......
  • 刷题总结——滑动窗口与双指针
    总结问题类型滑动窗口(同向双指针)定长不定长求最长/最大求最短/最小求子数组个数单序列双指针(同向/相向)同向:快排求partition的Lobos算法相向:三数之和(保证有序)注意去重双序列双指针双指针子序列判断多指针荷兰旗lowmidhigh00n初始化直到mid与high......
  • 【优选算法】——滑动窗口(下篇)
    目录1、水果成篮2、找到字符串中所有字母异位词3、串联所有单词的子串4、最小覆盖子串1、水果成篮你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。你想要尽可能多地收集水果......
  • C语言经典20例(输入数组元素,求出最大值和最小值,并输出)
    在c语言中,要实现要实现“输入数组元素,并求出最大值和最小值,并输出”主要步骤主要有以下几步:1.必要的头文件。2.定义数组大小。3.从用户那里接受数组元素的输入4.使用循环遍历数组。找出最大值和最小值5.输出最大值和最小值代码如下:#include<stdio.h>intmain(){......
  • 直推杆滑动电阻
       最小处或者最大处 总阻值17.4千欧 滑动条最小处     输入地线和输出地线阻值0千欧姆   输入地线和输出红线阻值8.7千欧姆( 0.5最大阻值)   输出地和输出正极 阻值0滑动条最大处   输入地线和输出地线阻值8.7千欧姆 ( 0.5......
  • 动态中的守候:滑动窗口与距离的诗篇
    公主请阅1.长度最小的子数组1.1题目说明示例1示例1示例2示例31.2题目分析1.3代码部分1.4代码分析2.无重复字符的最长子串2.1题目说明示例1示例1示例2示例32.2题目分析2.3代码部分2.4代码分析2.5代码深度分析1.长度最小的子数组题目传......
  • 细聊滑动窗口
    前段时间忙于写系列文章,怒刷算法题的进度算是耽误了不少。刚好遇到了一道需要滑动窗口的题目,做完之后觉得挺有意思,有必要好好聊一下滑动窗口。所谓滑动窗口(slidewindow)是一种优化算法的抽象概念,主要于解决数组、字符串等线性结构中的子数组或子序列问题。它的整个思路是通过维护......