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

【算法题】滑动窗口求最值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 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       31 [3  -1  -3] 5  3  6  7       31  3 [-1  -3  5] 3  6  7       51  3  -1 [-3  5  3] 6  7       51  3  -1  -3 [5  3  6] 7       61  3  -1  -3  5 [3  6  7]      7

方法思路

  1. 单调队列的维护:使用一个双端队列(Deque),队列中存储的是数组元素的索引。队列中的元素对应的数组值是单调递减的。
  2. 处理滑动窗口的移动
    • 当滑动窗口向右移动时,新元素进入窗口。如果队列尾部元素对应的数组值小于等于当前新元素的值,就将队列尾部元素弹出,直到队列尾部元素对应的数组值大于当前新元素的值,再将当前新元素的索引加入队列尾部。这样保证了队列的单调递减性。
    • 同时,要检查队列头部的元素是否已经不在当前滑动窗口内(即索引小于当前窗口的左边界),如果是,就将队列头部元素弹出。
  3. 获取窗口最大值:当滑动窗口的右边界移动到至少k - 1的位置时,队列头部的元素对应的数组值就是当前滑动窗口的最大值,将其加入结果列表。

import java.util.ArrayDeque;
import java.util.Deque;public class SlidingWindowMaximum {public int[] maxSlidingWindow(int[] nums, int k) {if (nums == null || nums.length == 0 || k <= 0) {return new int[0];}int n = nums.length;int[] result = new int[n - k + 1];int index = 0;Deque<Integer> deque = new ArrayDeque<>();for (int i = 0; i < n; i++) {// 维护队列的单调递减性,弹出队列尾部小于等于当前元素的索引while (!deque.isEmpty() && nums[deque.peekLast()] <= nums[i]) {deque.pollLast();}// 将当前元素索引加入队列尾部deque.offerLast(i);// 检查队列头部元素是否在窗口外if (deque.peekFirst() == i - k) {deque.pollFirst();}// k - 1后才形成窗口,此时记录最大值if (i >= k - 1) {result[index++] = nums[deque.peekFirst()];}}return result;}public static void main(String[] args) {SlidingWindowMaximum solution = new SlidingWindowMaximum();int[] nums = {1, 3, -1, -3, 5, 3, 6, 7};int k = 3;int[] result = solution.maxSlidingWindow(nums, k);for (int num : result) {System.out.print(num + " ");}}
}

http://www.dtcms.com/a/582614.html

相关文章:

  • wordpress 无广告视频插件下载滨州seo排名
  • el-upload实现文件上传预览
  • 嵌入式Linux C语言程序设计九
  • Git 分支流程(合并分支)
  • idea可以做网站吗最好的网站代运营公司
  • BSS供应商:电信与金融领域的幕后支撑者
  • 精通网站开发书籍wordpress 很占内存
  • 找个男做那个视频网站好东营网站建设哪家更好
  • Linux/Windows 安装miniforge
  • 近3年时政与综合类结构化真题汇总与备考策略
  • 设备资产管理都有哪些具体业务
  • 从一到无穷大 #55 提升Lakehouse查询性能:数据层面
  • 交互设计专业学什么seo常用工具网站
  • 如何让百度快速大量收录 如何增加百度收录量的方法有哪些
  • APP上架到应用商店的完整流程解析
  • 莆田网站建设维护网站制作的分割线怎么做
  • Python 字典推导式入门:一行构建键值对映射
  • 怎么让自己的网址被百度收录(网站如何被百度收录进去)
  • 简易静态网站制作流程图室内设计师工资
  • 爬虫导致IP被封号了如何解封?
  • 网站平台建设公司邮箱或企业邮箱
  • 临沂网站制作加速企业发展用什么软件制作网站
  • C++:类和对象---进阶篇
  • 深圳市南山区住房和建设局网站官网淘宝客怎么做网站导购
  • e网科技网站石家庄seo网站优化公司
  • 合肥响应式网站开发方案网站建设新得体会
  • 手绘教学网站网络规划与设计专业
  • 网站做多语言wordpress 仿虎嗅
  • 打工人日报#20251107
  • 网站常用颜色wordpress 替换编辑器