当前位置: 首页 > news >正文

LeetCode Hot100之十:239.滑动窗口最大值

题目

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

返回 滑动窗口中的最大值 。

在这里插入图片描述

提示:

1 <= nums.length <= 10^5
-10^4 <= nums[i] <= 10 ^4
1 <= k <= nums.length

思路

如果暴力做法,就是维护一个长度为k的数组,没移动时先遍历该数组,把最大值找出来。然后每移动一次,如果右边新加入的数>原最大值,则更新最大值。如果左边移走的数就是最大值,那么需要遍历此时移动后的数组,找出最大值。这个找出最大值的过程为O(k)。移动整体窗口的过程是O(n),合起来就是O(nk),会超出时间限制。因为移动整体窗口的过程是省略不了的,我们只能考虑如何将找出最大值的O(k)降为O(1)。

我们观察滑动窗口,如果此时滑动窗口中只有两个下标i和j,且i<j,nums[i]>=nums[j],那么只要i还在窗口内,那么j也一定还在窗口内。且nums[i]一定是窗口中的最大值,我们便不用再去遍历整个窗口了。如果我们以这个性质为出发点,维护一个严格单调递减的,下标从小到大的队列。即队列里存储的是下标,但是值是严格单调递减的。那么就相当于队列里存储的是原数组第一大元素的下标,原数组第二大元素的下标,原数组第三大元素的下标……。

当向右滑动,遍历到一个新元素now时,我们

  1. 首先需要判断now是否大于队列末尾的第k大元素klast。
    • 如果now>klast,那么意味着队列的元素,谁是第几大需要重新定义,于是只要队列不为空,我们便将now与队列末尾的元素last一个个比较,如果now大于last,就将last踢出队列,直到遇到一个比now大的元素,再将now插入到队列末尾(因为那些被踢掉的last永远不可能是答案,队列没有维护它们的必要)。
    • 如果now<klast,那么直接将now插入到队列末尾即可。
  2. 其次,我们再判断向右滑动时是否会导致队首,即原数组第一大元素滑出队列,因为队列中存储的是在原数组的下标,那么我们只需要判断这个队首元素是否>i-k即可。

java代码

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int len = nums.length;Deque<Integer> deque = new LinkedList<>();int[] ans = new int[len-k+1];for(int i=0;i<k;i++){while(!deque.isEmpty()&&nums[i]>=nums[deque.peekLast()]){deque.pollLast();}deque.offerLast(i);}ans[0]=nums[deque.peekFirst()];for(int i=k;i<len;i++){while(!deque.isEmpty()&&nums[i]>=nums[deque.peekLast()]){deque.pollLast();}deque.offerLast(i);if(deque.peekFirst()<=i-k){deque.pollFirst();}ans[i-k+1]=nums[deque.peekFirst()];}return ans;
}
}

效率分析

28ms,击败80.23%使用 Java 的用户。没必要再优化了。

http://www.lryc.cn/news/234489.html

相关文章:

  • x264、x265、OpenH264 简要对比
  • 二维码智慧门牌管理系统升级解决方案:门牌聚合,让管理更便捷!
  • 物联网AI MicroPython学习之语法UART通用异步通信
  • Git企业开发级讲解(四)
  • pytorch 安装 2023年
  • 人工智能基础_机器学习040_Sigmoid函数详解_单位阶跃函数与对数几率函数_伯努利分布---人工智能工作笔记0080
  • Scala---迭代器模式+Trait特质特性
  • labview运行速度太慢
  • QT基础入门【QSS】继承、命名空间中的小部件、QObject 属性介绍
  • Ubuntu18.04安装IgH主站
  • HTML5-原生History
  • 无需公网IP,使用MCSM面板一键搭建我的世界Minecraft服务器联机游戏
  • 高斯积分-Gaussian Quadrature
  • Linux下非root用户安装CUDA
  • 【bugfix】安装 flash-attn 报错
  • 技术实践|高斯集群服务器双缺省网关故障分析
  • 手把手教你搭建Maven私服
  • LeetCode 面试题 16.25. LRU 缓存
  • LaTeX 数学公式常见问题及解决方案
  • 2023最新软件测试20个基础面试题及答案
  • JMeter-BeanShell预处理程序和BeanShell后置处理程序的应用
  • Java声明式事务实战!工作中用这几种就够了!
  • Abp6.0 使用 appsettings.json配置Serilog.Sinks.MariaDB
  • 关于Flume-Kafka-Flume的模式进行数据采集操作
  • WeTab--颜值与实力并存的浏览器插件
  • 2023/11/15JAVA学习(线程池,Executors,网络编程,InetAddress,UDP,TCP,DatagramSocket)
  • 【整理】HTTP相关版本对比
  • spark性能调优 | 默认并行度
  • Python-pptx教程之二操作已有PPT模板文件
  • 生活总是自己的,请尽情打扮,尽情可爱,,