算法的学习笔记—滑动窗口的最大值(牛客JZ59)

news2025/1/12 20:45:30

在这里插入图片描述

img

😀前言
滑动窗口问题是常见的算法题型,主要考察如何在限定窗口内找到特定值,比如最大值、最小值等。在这篇文章中,我们将深入分析“滑动窗口的最大值”问题的求解方法,并提供一种实现思路,以帮助大家更好地理解该问题。

🏠个人主页:尘觉主页

文章目录

  • 🥰滑动窗口的最大值
    • 题目链接
    • 😀问题描述
    • ❤️‍🔥解题思路
      • 1. 使用大顶堆求解
      • 2. 时间复杂度分析
    • 💝代码实现
      • 代码解释
      • 代码优化建议
    • 😄总结

🥰滑动窗口的最大值

题目链接

牛客网

😀问题描述

给定一个整数数组 num 和一个整数 size 代表滑动窗口的大小,需要找到每次窗口滑动时的最大值,最后将所有窗口的最大值组合成一个数组返回。例如,对于数组 {2, 3, 4, 2, 6, 2, 5, 1} 和窗口大小 3,滑动窗口的最大值为 {4, 4, 6, 6, 6, 5}

这类问题的挑战在于如何高效地找到滑动窗口中的最大值并随着窗口的移动进行更新,而不是每次移动窗口后重新计算。

image-20201104020702453

❤️‍🔥解题思路

大顶堆法是解决滑动窗口最大值问题的一种高效方案。我们可以使用优先队列(大顶堆)来维护窗口内的最大值。

1. 使用大顶堆求解

大顶堆是一种数据结构,堆顶元素始终是堆中的最大元素。在 Java 中可以使用 PriorityQueue 实现大顶堆,通过传入比较器定义排序方式。以下是解决该问题的详细步骤:

  1. 初始化窗口内的元素:在 num 数组中,首先将前 size 个元素加入到大顶堆中。这样,堆顶元素就是当前窗口的最大值。
  2. 向右滑动窗口:从 size开始,逐步向右滑动窗口,维护堆内的元素。
    • 删除窗口左侧离开的元素,即将堆中的最旧元素移除。
    • 将窗口新加入的元素插入堆中。
    • 堆顶元素即为当前窗口的最大值,将其加入结果数组中。
  3. 完成滑动过程:当窗口滑动到数组末尾时,结束循环。

2. 时间复杂度分析

假设数组的长度为 N,窗口大小为 M。在窗口滑动的过程中,每次添加或删除元素的时间复杂度为 O(log M),因此总体时间复杂度为 O(N log M)。空间复杂度为 O(M),用于存储滑动窗口内的元素。

💝代码实现

以下是该方法的 Java 代码:

import java.util.ArrayList;
import java.util.PriorityQueue;

public class MaxInSlidingWindow {
    public ArrayList<Integer> maxInWindows(int[] num, int size) {
        ArrayList<Integer> ret = new ArrayList<>();
        if (size > num.length || size < 1)
            return ret;
        
        // 创建大顶堆
        PriorityQueue<Integer> heap = new PriorityQueue<>((o1, o2) -> o2 - o1);
        
        // 初始化第一个窗口的元素到堆中
        for (int i = 0; i < size; i++)
            heap.add(num[i]);
        
        // 记录第一个窗口的最大值
        ret.add(heap.peek());
        
        // 滑动窗口
        for (int i = 0, j = i + size; j < num.length; i++, j++) {
            heap.remove(num[i]);  // 移除窗口最左侧的元素
            heap.add(num[j]);      // 添加窗口右侧新元素
            ret.add(heap.peek());   // 堆顶元素为当前窗口的最大值
        }
        
        return ret;
    }
}

代码解释

  • PriorityQueue<Integer> heap = new PriorityQueue<>((o1, o2) -> o2 - o1);:定义了一个大顶堆。
  • heap.peek():获取当前窗口的最大值。
  • 在每次滑动时,通过 heap.remove() 删除旧元素,heap.add() 添加新元素,维护窗口最大值。

代码优化建议

大顶堆的实现适合窗口大小较小、元素数量适中的情况。在窗口较大或数据量较多的情况下,也可以使用双端队列来提高效率。双端队列的解法可以将时间复杂度降低到 O(N),适合更大规模的数据。

😄总结

滑动窗口最大值问题在算法题中具有较高的实用性和典型性。掌握使用大顶堆解决该问题的方法,对于理解和应用优先队列以及堆数据结构有很大帮助。希望本文的分析和代码示例可以帮助大家更好地理解该问题,并在未来的算法学习中加以应用。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2227149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

惊人,合肥银泰的 LV 柜姐事件引发热议

安徽合肥银泰中心发生的这起“LV柜姐事件”引发了广泛关注。以下是该事件的详细情况&#xff1a;1. 事件起因&#xff1a;- 一名已婚男士到合肥银泰中心的LV专柜购物&#xff0c;因其年轻帅气且出手阔绰&#xff0c;LV柜姐添加了他的联系方式。之后&#xff0c;柜姐在明知男方有…

Python量化交易(五):量化择时策略

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的Python量化交易学习总结文档。在现代金融市场中&#xff0c;量化择时策略已成为投资者追求超额收益的重要工具。本文将系统梳理量化…

电气安全隐患不容忽视

在现代生活中&#xff0c;电力如同血液般滋养着城市的每一个角落&#xff0c;然而&#xff0c;当这股能量失控时&#xff0c;它也能瞬间化身为吞噬生命的火焰。根据国家消防局的权威数据&#xff0c;电气火灾占所有火灾的28.4%&#xff0c;而其中6.5%的源头直指短路——这一看似…

单细胞数据分析(三):单细胞聚类分析

文章目录 介绍目的加载R包数据链接导入数据可视化聚类选择聚类分辨率值输出结果系统信息介绍 单细胞聚类分析是一种用于解析单细胞RNA测序(scRNA-seq)数据的方法,旨在将成千上万个单细胞根据它们的基因表达模式分组到不同的类别或“簇”中。每个簇代表了具有相似基因表达特…

auto占位符(C++11~C++17)

文章目录 1. 定义1.1 注意事项 2. 推导规则3. 返回类型推导(C14)4. lambda表达式中使用auto类型推导5. 非类型模板形参占位符&#xff08;C17&#xff09; 1. 定义 在C11以前&#xff0c;auto关键字是用来声明自动变量的。从C11起auto被用来&#xff1a;声明变量时根据初始化表…

推荐收藏!一款超好用的网盘资源搜索工具

抖知书老师推荐&#xff1a; 盘搜问世以来&#xff0c;以其简洁、实用的设计&#xff0c;迅速成为网民心中的网盘资源搜索利器。对于那些日常生活离不开网盘的用户来说&#xff0c;盘搜的存在让他们的资源查找变得更加便捷和高效。从影视资源到课程资料再到个人文件&#xff0…

opencv - py_imgproc - py_filtering filtering 过滤-卷积平滑

文章目录 平滑图像目标2D 卷积&#xff08;图像过滤&#xff09;图像模糊&#xff08;图像平滑&#xff09;1. 平均2. 高斯模糊3. 中值模糊4. 双边滤波 其他资源 平滑图像 目标 学习&#xff1a; 使用各种低通滤波器模糊图像将定制滤波器应用于图像&#xff08;2D 卷积&…

MT1401-MT1410 码题集 (c 语言详解)

目录 MT1401归并排序 MT1402堆排序 MT1403后3位排序 MT1404小大大小排序 MT1405小大大小排序II MT1406数字重排 MT1407插入 MT1408插入 MT1409旋转数组 MT1410逆时针旋转数组 MT1401归并排序 c 语言实现代码 #include <stdio.h>// merge two subarrays void merge(int a…

大数据日志处理框架ELK方案

介绍应用场景大数据ELK日志框架安装部署 一&#xff0c;介绍 大数据日志处理框架ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;是一套完整的日志集中处理方案&#xff0c;以下是对其的详细介绍&#xff1a; 一、Elasticsearch&#xff08;ES&#xff09; 基本…

PHP海外矿物矿机理财投资源码-金融理财投资源码

PHP海外矿物矿机理财投资源码/金融理财投资源码 海外矿物矿机理财投资源码 测试不错,可以做其他产品理财,功能都没啥太大问题

Unity3D学习FPS游戏(1)获取素材、快速了解三维模型素材(骨骼、网格、动画、Avatar、材质贴图)

前言&#xff1a;最近重拾Unity&#xff0c;准备做个3D的FPS小游戏&#xff0c;这里以官方FPS案例素材作为切入。 导入素材和素材理解 安装Unity新建项目新建文件夹和Scene如何去理解三维模型素材找到模型素材素材预制体结构骨骼和网格材质&#xff08;Material&#xff09;、…

php反序列化漏洞典型例题

1.靶场环境 ctfhub-技能树-pklovecloud 引用题目&#xff1a; 2021-第五空间智能安全大赛-Web-pklovecloud 2.过程 2.1源代码 启动靶场环境&#xff0c;访问靶场环境&#xff0c;显示源码&#xff1a;直接贴在下面&#xff1a; <?php include flag.php; class pks…

【flask】 flask redis的使用

目的&#xff1a;如何使用在flask web项目中连接redis&#xff0c;并简单的使用 使用的库包&#xff1a;flask-redis pip install falsk-redis下面的写法是对项目代码进行模块化拆分的写法&#xff0c;在app.py中只进行对象的初始化等操作&#xff1b;exts.py中创建对象&…

【含文档】基于ssm+jsp的房屋中介服务平台(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: apache tomcat 主要技术: Java,Spring,SpringMvc,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定义了两个…

CI/CD 的原理

一、CI/CD 的概念 CI/CD是一种软件开发流程&#xff0c;旨在通过自动化和持续的集成、测试和交付实现高质量的软件产品。 CI(Continuous Integration)持续集成 目前主流的开发方式是协同开发&#xff0c;即多位开发人员同事处理同意应用不同模块或功能。 如果企业在同一时间将…

网络请求自定义header导致跨域问题

我记得我的项目之前已经解决了跨域问题。 后来在功能开发着&#xff0c;需要添加一个自定义的header&#xff0c;发现又出现跨域报错。 于是又开始一通摸索折腾。 我的项目前面端是用axios网络请求&#xff0c;通过拦截器添加header&#xff0c;代码如下&#xff1a; //添加请…

python实战项目47:Selenium采集百度股市通数据

python实战项目47:Selenium采集百度股市通数据 一、思路分析二、完整代码一、思路分析 这里以获取百度股市通股评下的投票数据为例,页面中的其他数据同理。由于此页面数据是js动态加载的,所以采用Selenium获取数据。思路很简单,通过Selenium打开页面,然后定位到“股评”选…

《使用Gin框架构建分布式应用》阅读笔记:p212-p233

《用Gin框架构建分布式应用》学习第12天&#xff0c;p212-p233总结&#xff0c;总22页。 一、技术总结 1.JavaScript知识点 (1)class、method (2)function, arrow function, (3)fetch() (4)Promise, then() 2.bootstrap 第5章主要涉及前端技术的运用&#xff0c;作为后…

nfs作业

nfs作业 服务机&#xff1a; 编写配置文件&#xff1a; [rootlocalhost ~]# vim /etc/exports 配置文件内容&#xff1a; /nfs/shared *(ro,sync) /nfs/upload 192.168.36.0/24(rw,anonuid210,anongid210,sync) /home/tom 192.168.36.132(rw) 创建目录&#xff0c;文件&am…

紫杉醇的药物代谢-文献精读73

Hydrogen-Bond-Assisted Catalysis: Hydroxylation of Paclitaxel by Human CYP2C8 氢键辅助催化&#xff1a;人类CYP2C8对紫杉醇的羟基化 摘要 紫杉醇&#xff08;PTX&#xff0c;或称Taxol&#xff09;是一种广泛用于治疗多种癌症的化疗药物&#xff0c;经过细胞色素P450酶…