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

239. 滑动窗口的最大值

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

解题思路:
这道题很容易就可以想到暴力的做法,遍历每个长度为k的子数组,然后遍历查找子数组内的最大值。但是这样做的话会导致超时。所以不能通过遍历子数组来查找子数组中的最大值。

经过分析,我们可以发现,当窗口向右移动,nums[i]进入窗口,那么窗口内所有比它小的值是不可能成为窗口内的最大值的,只有比它大的值才可能是窗口内的最大值。如果每个nums[i]进入窗口,就把窗口内比它小的数删除,那么窗口内剩余的值全是比它大的,也就是呈现一个单调递减的序列,那么自然该序列的第一个元素就是要找的最大值。

同时,如果窗口长度超过了k,就要把窗口第一个元素移除。

所以我们需要移除窗口头部的元素,也需要在窗口尾部增加或删除元素,自然就想到用双端队列来模拟滑动窗口。

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int n = nums.length;Deque<Integer> que = new ArrayDeque<>();int[] ans = new int[n - k + 1];for(int i = 0; i < n; i++){// 1、入队前需要删除比它小的所有元素while(!que.isEmpty() && nums[que.getLast()] <= nums[i]){que.removeLast();}que.addLast(i);// 2、如果窗口长度大于k,删除队首元素if(que.getFirst() <= i - k){que.removeFirst();}// 3、记录答案if(i >= k - 1){ans[i - k + 1] = nums[que.getFirst()];}}return ans;}
}

相关文章:

  • C语言:指针进阶(下)
  • 从代码学习深度学习 - 全局向量的词嵌入(GloVe)PyTorch版
  • codeforces C. Devyatkino
  • 建筑末端配电回路安全用电解决方案:筑牢电气防火最后一道防线
  • 华为云Flexus+DeepSeek征文 | 基于华为云ModelArts Studio搭建AnythingLLM聊天助手
  • 边缘计算一:现代前端架构演进图谱 —— 从 SPA 到边缘渲染
  • 【大模型训练】中短序列attention 和MOE层并行方式(二)
  • 深度剖析:UI 设计怎样为小程序构建极致轻量体验
  • 从0到1掌握Sqoop:开启大数据迁移之旅
  • Kivy的ButtonBehavior学习
  • java面向对象高级部分
  • day6补 cpp:c++输入输出流,流的四种状态,标准输入输出流
  • CUDA 与 cuDNN 免登录下载政策详解(基于官方权威信息)
  • 软件确认测试报告:如何评估软件功能及测试关键点?
  • Java并发编程实战 Day 17:CompletableFuture高级应用
  • 爬虫+动态代理助力 AI 训练数据采集
  • QT绘制会动的蚂蚁线
  • AI服务代码说明文档
  • STM32学习之不同FLASH的芯片启动文件选择规则
  • 数据冗余对企业运营的隐性成本
  • 商务网站设计特色/网址域名大全
  • 做网站经常加班还是app/网络产品运营与推广
  • 枣庄市市中区建设路网站/电商运营培训课程
  • 中国互联网协会官网/宁波seo营销平台
  • 宁波企业网站搭建特点/seo价格查询公司
  • 沈阳谷歌网站建设/学做网站培训班要多少钱