leecode239 滑动窗口的最大值

Leecode.239——滑动窗口最大值(单调队列、优先队列) 空间复杂度:O(k)。与方法一不同的是,在方法二中我们使用的数据结构是双向的,因此「不断从队首弹出元素」保证了队列中最多不会有超过 k+1个元素,因此队列使用的空间为 O(k)。官方给的核心思路还是一样的,对于两个相邻(只差了一个位置)的滑动窗口,它们共用着 k−1个元素,而只有1个元素是变化的。这里所有的空间复杂度分析都不考虑返回的答案需要的 O(n) 空间,只计算额外的空间使用。用一个滑动窗口,每一次滑动,只关心出去的元素和进入的元素,以及之前的最大值的关系,这样能避免一部分求最大值的操作。 阅读详情

在这里插入图片描述

我的思路

这个题目我的第一思路就是暴力解法,因为这个题目的基础逻辑很简单,就是不断的去求每一个区间的最大值即可。
那么我们可以直接创建left和right数组,然后遍历这个数组中的每一个滑动窗口,然后得出其中的最大值,并将其填入结果中即可。

public int[] maxSlidingWindow(int[] nums, int k) {
    int left = 0,right = 0;
    int[] ans = new int[nums.length-k+1];
    for( ; left<nums.length-k+1;left++){
        int max = nums[left];
        for(right = left;right<left+k;right++){
            max = Math.max(max,nums[right]);
        }
        ans[left] = max;
    }
    return ans;
}

这种暴力解法只能够通过41/51个测试用例,所以我们要想办法降低时间消耗

我的最初想法是利用这个Treeset集合进行快速排序,但是这个有个问题就是如果这个数组中有重复的最大值,它不仅会将这个窗口中的第一个元素删除掉,也会将这个数组的其它部分删除了。

public static int[] leecode239(int[] nums, int k) {
    int[] ans = new int[nums.length-k+1];
    TreeSet<Integer> set = new TreeSet<>();
    for(int i = 0;i<k;i++){
        set.add(nums[i]);
    }
    ans[0] = set.last();
    for(int i = k;i<nums.length;i++){
        set.remove(nums[i-k]);
        set.add(nums[i]);
        ans[i-k+1]=set.last();
    }
    return ans;
}

灵神思路

灵神是利用了双端队列来实现的这个,他并没有存放这个窗口中的所有元素,而是观察出来这个窗口的最大值规律

灵神利用了滑动窗口和双端队列,利用双端队列记录本轮中最大值的位置,但是他不仅仅记录了这个最大值的位置,还记录了可能作为下一轮窗口最大值的位置(只要这个元素大于左边的元素,就有可能作为后续的最大值,如果这个元素小于左边的元素,那么就不会作为后续的最大值)

滑动窗口三步走,进,出,记录答案

  1. 元素进入窗口

    1. 先判断窗口中是否为空的,如果不为空,判断这个元素与队列中的最近添加的元素的大小关系,如果这个元素比较大 ,那么说明,它可能是后续窗口的最大值,队列中的最后一个元素就不可能是最大值了

      1. 比如说4,1,2,5,6对于这个数组来说,当1后面是2的时候,那么这个窗口中1就不可能是最大值,1后面的窗口也不能是1为最大值,可能是2为最大值
    2. 元素进入窗口

  2. 元素出窗口

    1. 获取元素的左端点。
    2. 判断这个队列中是否存了窗口以外的下标,如果存了,将其移出去,如果没有就不做修改
  3. 更新答案,以数组为:4,1,6,7,4。k=3来说

    1. 第一个窗口,下标为0,1,2但是当i=3时,发现nums[deque.getLast()]<=nums[i],此时就会把下标1删除,删除之后发现还是nums[deque.getLast()]<=nums[i],继续删除,最后就是保留了这个窗口中最大值的下标2
    2. 第二个窗口中,下标为1,2,3。一样会把这个6的下摆哦删除,保留7的下标
    3. 以此类推
public int[] maxSlidingWindow(int[] nums, int k) {
    int[] ans = new int[nums.length-k+1];
    Deque<Integer> deque = new ArrayDeque<>();
    for(int i = 0;i<nums.length;i++){
        //进入窗口
        //窗口中记录滑动窗口中的较大元素,比如说4,1,2,对于这个数组来说,当1后面是2的时候,那么这个窗口中1就不可能是最大值,1后面的窗口也不能是1为最大值,可能是2为最大值
        while (!deque.isEmpty()&&nums[deque.getLast()]<=nums[i]){
            deque.removeLast();
        }
        deque.addLast(i);
        //出窗口
        int left = i-k+1;//窗口的左端点
        if(deque.getFirst()<left){
            deque.removeFirst();
        }

        //更新答案,刚开始只保存,但是不更新,遇到第一个窗口之后才更新
        if(left >= 0){
            ans[left]=nums[deque.getFirst()];
        }
    }
    return ans;
}
已解决“TimeouEror [WinEror 10060由于连接方在一段时间后没有正确答复 或连接的主机没有反应,连接尝试失败“,亲测有效!!! 已解决"TimeouEror [WinEror 10060由于连接方在一段时间后没有正确答复 或连接的主机没有反应,连接尝试失败",亲测有效!!! 阅读详情

相关推荐

Power BI应用案例:淘宝用户行为分析实战

一、案例背景 基于千万级的淘宝用户的使用记录,对淘宝用户的行为进行分析,具体指标包括:日PV、日UV、小时PV、小时UV、不同用户行为的PV、用户购买次数分布、用户购买频次分布、活跃用户消费情况等。通过本案例,可以基本看看Power BI都能分析达到怎么样的效果。 二、数据来源及结构 阿里天池官方发布的1万用户在2014年双十二期间的行为记录,数据量达1200万+。 数据下载地址:...

灰哥数据智能的专栏 1万+

leecode 239. 滑动窗口最大值

/** * Created by zhanghaipeng on 2019/8/9. * 给定一个数组 nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k个数字。滑动窗口每次只向右移动一位。 * 返回滑动窗口中的最大值。 * * 示例: * 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 * 输出...

haponchang的博客 398

AI辅助编程实战指南:从提示工程到开发环境搭建

大型语言模型(LLM)作为现代人工智能的核心技术,通过自然语言理解和生成能力,正在深刻改变软件开发范式。其原理基于海量代码和文本数据的预训练,能够根据上下文生成符合逻辑的代码片段和解决方案。这一技术的核心价值在于将开发者从繁琐的语法和基础逻辑编写中解放出来,提升开发效率与代码质量。在实际工程应用中,AI辅助编程已广泛应用于日常编码、代码调试、文档生成和系统设计等场景。其中,提示工程(Prompt Engineering)和检索增强生成(RAG)是两项关键技术:前者通过结构化、角色化的指令设计,引导AI生成更

weixin_26775679的博客 620

LeeCode 239.滑动窗口最大值

滑动窗口最大值 题目描述 解题思路 通过构建双向队列记录索引并进行如下的操作: 我们将窗口逐渐地向右移。 1.当队列不空且当前队头索引不在窗口内时,pop_front(); 2.当队列不空且队尾索引对应的值小于当前值时,pop_back(); 3.将当前地索引插入队尾。 4.返回队首元素为此时窗口内地最大值地索引 代码实现 class Solution { public: //双向队列 ...

weixin_44178061的博客 210

【OpenAirInterface知识-3】OAI端到端部署之5G基站部署

在上一篇文章中已经完成了5G核心网的部署,本篇文章将介绍OAI 5G基站的部署过程。

起名字难上难的博客 3421

LTspice introduction - 2 LTspice的界面

LTspice的界面主要有两个:Schematic Capture和Waveform Viewer Schematic Capture 它主要是用来画电路图的,画完电路图之后,添加一些dot 命令同时选择一些仿真的参数,点击执行(Run)Waveform Viewer 如果你的仿真不是op point的话,一个都会打开它,在它里面你可以画图相应的图形。 有两种方式可以在Viewer

贾亮的专栏 3220

LeeCode239. 滑动窗口最大值

题目要求求解滑动窗口内的最大值。暴力法虽可行但超时,优化方案使用双端队列维护单调递减的下标,确保队首始终为当前窗口最大值。每次加入新元素前移除队尾小于等于它的下标,保证单调性;同时移除超出窗口范围的下标。当窗口大小达到k时,记录队首元素。时间复杂度O(n),空间复杂度O(k)。

u012116089的博客 196

Zemax操作41--公差分析(一)

zemax公差

lzy750750的博客 5973

leecode:239. 滑动窗口最大值

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

m0_73915763的博客 411

【Unity小游戏】整整一个周末写一款《皇室战争 玩法》 的 即时战斗类 游戏Demo。两万多字游戏制作过程+解析

Unity游戏制作,本篇文章介绍了复刻皇室战争玩法的一个自制小游戏,共有该游戏的两万字教程加制作过程,欢迎品尝! 世界上没有绝对的公平,如果我们起点就比别人第一步,那就更需要比别人努力了。

努力前行,总会成为自己心中的那道光 12万+

Freeswitch 如何检测链路是否有回铃音

Freeswitch回铃音检测解决方案 问题描述:呼叫手机时,虽然信令正常(183/180),但部分手机无回铃音,导致坐席无法判断是否接通,用户体验差。 解决方案: 先播放本地音频作为回铃音 实时检测用户侧是否有声音输入 检测到声音后自动切换为用户侧音频 技术实现: 使用Freeswitch APP实现功能 创建结构体保存实例数据(包括铃声文件、会话句柄、VAD检测器等) 通过media bug机制实现音频流的替换 利用VAD(语音活动检测)技术监控用户侧声音 当检测到用户说话时自动终止本地铃声播放 该方案

2301_81507069的博客 51

Leecode刷题笔记——239. 滑动窗口最大值

思路如下: 两次for循环,外面一层遍历整个数组,里面一层遍历窗口部分,每次都将窗口中最大值选出来存到结果数组中即可。 class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int m=nums.length; //结果数组,长度为m-k+1 int[]res...

Tyxxxxxx 197

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

06 滑动窗口最大值(leecode 239)

1 问题 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例 1: 输入: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

weixin_42454048的博客 160

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LeeCode( 优先队列)239_ 滑动窗口最大值

LeeCode( 优先队列)239_ 滑动窗口最大值 题目: 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例 1: 输入: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

u013456390的博客 290

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

每日一练:LeeCode-239. 滑动窗口最大值(难)-【双向队列】

本文是力扣LeeCode-239. 滑动窗口最大值 我学习与理解的过程

小孔靠得住的博客 1103

LeeCode:239. 滑动窗口最大值(单调队列实现)

一、题目描述: 给你一个整数数组 nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例 1: 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6...

weixin_46623714的博客 383

LeeCode_239. 滑动窗口最大值(优先队列+双端单调队列)

一、介绍 1.题目描述 题目链接:https://leetcode-cn.com/problems/sliding-window-maximum/ 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 注意事项: 如果 k = 1,可以直接返回 2.测试样例 [1,3,-1,-3,5,3,6,7] 3 # [3,3,5,5,6,7] [1] 1 # [1] [1

Netceor的博客 242

代码随想录算法训练营第十三天|239.滑动窗口最大值 347.前 K 个高频元素

窗口移动时,若移除的元素是队首元素,就将其弹出,若不是,说明这个元素因为较小已经被移出队列了,就不用再管它。插入元素时,若插入的元素大于前面元素,删除前面元素。push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止。pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作。首先将前k个元素依次进行入队操作,若插入元素大于前面元素,就删除前面元素。

weixin_74976519的博客 1704

代码随想录算法训练营第十三天 | LeeCode 239. 滑动窗口最大值,347.前 K 个高频元素

寻找前k个最大元素流程如图所示:(图中的频率只有三个,所以正好构成一个大小为3的小顶堆,如果频率更多一些,则用这个小顶堆进行扫描)定义:priority_queue//默认是大顶堆Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。

thels_的博客 1214

Leecode.239 滑动窗口最大值、347 前 K 个高频元素 | 代码随想录训练营第十三天

Leecode.239 滑动窗口最大值、347 前 K 个高频元素 | 代码随想录训练营第十三天

lv364365706的博客 105

Java实现 LeetCode 239 滑动窗口最大值

239. 滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到...

5384

LeetCode 239.滑动窗口的最大值

leetcode239.滑动窗口的最大值 原题目 思路 思路一: 自己刚刚写的时候,是用优先队列写的,每次从队列中取出的都是当前队列中的最大值,加到结果中去。代码如下: class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums.length==0) ret...

斑布点月 504

LeetCode 239: 滑动窗口最大值(困难)

LeetCode 239: 滑动窗口最大值 解答 代码一:大根堆 最好的解法是单调队列,但是一开始想的是大根堆 问题在于如何将滑动窗口移出的元素从大根堆中删除,大根堆只能pop,没法移除特定的元素。这里就陷入了困境。 解决方法是判断top是否在滑动窗口内,因此要将下标放入大根堆中,判断top->second是否大于i-k 滑动窗口的大小永远小于等于k,但是这里大根堆的大小最坏情况是O(n),自己没有想到上面的转换, 很大程度上我就是既想删除移出的元素,又想保持大根堆元素小于等于k,陷入了困境。现在

weixin_44343319的博客 757

LeetCode 239.滑动窗口最大值

题目描述 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 解题思路 deque的使用:https://blog.youkuaiyun.com/sinat_36165006/article/details/55803329?ops_request_misc=%257B%...

soulmate______的博客 253

LeetCode 239. 滑动窗口最大值

题目描述 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 [1 3 -1]...

Aries_young的博客 260
上一篇: leecode560 和为K的子数组
下一篇: leecode92 反转链表II
TranquilGlow
博客等级 码龄5年 132粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值