代码随想录算法训练营之JAVA|第十一天| 239. 滑动窗口最大值

news2025/4/15 20:10:13

今天是第11天刷leetcode,立个flag。

算法挑战链接

239. 滑动窗口最大值https://leetcode.cn/problems/sliding-window-maximum/description/

第一想法

题目理解:找到滑动窗口中最大的值,写入数组中,返回该数组即可。

第一个想法是暴力循环,我只需要对窗口的值进行排序,然后取出最大值就行。简单。

代码如下:

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        // 暴力解法
        if (nums == null || nums.length < 1 || k < 1) {
            throw new IllegalArgumentException();
        }
        int length = nums.length;
        int[] res = new int[length - k + 1];
        // i 为窗口的左边界
        for (int i = 0; i < length - k + 1; i++) {
            int max = Integer.MIN_VALUE;
            // j 从左边界开始,滑过窗口的范围
            for (int j = i; j < i + k; j++) {
                max = Math.max(max, nums[j]); // 记录窗口内的最大值
            }
            res[i] = max;
        }
        return res;
    }
}

 结果是超时了~~~~

看完代码随想录之后的想法 

代码随想录的做法是使用单调队列来完成的。这个做法是极好的。

单调队列就是记录窗口内值的单调性。你可以想象有一个数据结构,他可以:

  • 弹出第一个元素
  • 往队尾添加一个元素
  • 返回该队列的最大值

如果有这个一个数据结构,那么这道题不是轻松拿捏吗?

但是很可惜我们并没有这样一种数据结构,因此需要我们自己去实现这样一种数据接口。要实现这个数据结构也是比较简单的。

只需要保证队列是递减的即可。

对应三个操作应该是这样的:

  • 弹出第一个元素:
    • 如果该元素是队列的第一位,则在队列中移除第一位
    • 如果该元素不是队列的第一位,则不操作
  • 往队尾添加一个元素
    • 如果该元素大于最后一位的值,则移除最后一位,一直循环对比,找到比该元素大的值,并且放在该元素的后面
    • 如果该元素小于最后一位的值,则在末尾添加。
  • 返回该队列的最大值,返回队列的头

单调队列的实现如下:

class MyDeQueue {
    Deque<Integer> deque = new LinkedList<>();
    //弹出元素时,比较当前要弹出的数值是否等于队列出口的数值,如果相等则弹出
    //同时判断队列当前是否为空
    public void poll(int val) {
        if (!deque.isEmpty() && val == deque.peek()) {
            deque.poll();
        }
    }
    //添加元素时,如果要添加的元素大于入口处的元素,就将入口元素弹出
    //保证队列元素单调递减
    //比如此时队列元素3,1,2将要入队,比1大,所以1弹出,此时队列:3,2
    public void add(int val) {
        while (!deque.isEmpty() && val > deque.getLast()) {
            deque.removeLast();
        }
        deque.add(val);
    }
    //队列队顶元素始终为最大值
    public int peek() {
        return deque.peek();
    }
}

 那么题目的解答也就比较简单了

class Solution {
    
    class MyDeQueue {
    Deque<Integer> deque = new LinkedList<>();
    //弹出元素时,比较当前要弹出的数值是否等于队列出口的数值,如果相等则弹出
    //同时判断队列当前是否为空
    public void poll(int val) {
        if (!deque.isEmpty() && val == deque.peek()) {
            deque.poll();
        }
    }
    //添加元素时,如果要添加的元素大于入口处的元素,就将入口元素弹出
    //保证队列元素单调递减
    //比如此时队列元素3,1,2将要入队,比1大,所以1弹出,此时队列:3,2
    public void add(int val) {
        while (!deque.isEmpty() && val > deque.getLast()) {
            deque.removeLast();
        }
        deque.add(val);
    }
    //队列队顶元素始终为最大值
    public int peek() {
        return deque.peek();
    }
}
    
    
    public int[] maxSlidingWindow(int[] nums, int k) {
//有效值校验
        if (nums.length==1) {
            return nums;
        }
        if (nums.length < k) {
            k = nums.length;
        }
        //初始化
        MyDeQueue deQueue = new MyDeQueue();
        int[] result = new int[nums.length - k + 1];
        for (int i = 0; i < k; i++) {
            deQueue.add(nums[i]);
        }
        result[0] = deQueue.peek();
        int index = 0;
        //滑动窗口
        for (int i = k; i < nums.length; i++) {
            deQueue.poll(nums[index]);
            deQueue.add(nums[i]);
            index++;
            result[index]=deQueue.peek();
        }
        return result;
    }
}

实现过程中遇到哪些困难 

实现单调队列的时候是比较不能理解的,但是慢慢梳理后发现还是可以理解的。

梳理的过程使用的是工程的思维,单调队列有三个操作,那就从一个操作入手。搞定一个操作再去研究第二个操作,依次递推。也就是将大问题转化成小问题,再去解决小问题

今日收获

了解了另一种数据结构——单调队列

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

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

相关文章

VeriEye 13.0商用虹膜识别软件python SDK试用指南

最近&#xff0c;商用虹膜识别软件VeriEye 13.0发布&#xff0c;且额外地新增了python接口&#xff0c;这样就很方便大家直接调用其提供的虹膜识别接口了。 在使用python接口前&#xff0c;需要先下载安装试用版SDK&#xff0c;然后激活许可证。具体如下&#xff1a; 1. VeriE…

代码审计利器 Fortify SCA 2023.1(23.1) Crack

Fortify SCA 支持丰富的开发环境、语言、平台和框架&#xff0c;可对开发与生产混合环境进行安全检查。 25 种编程语言 超过 911,000 个组件级 API 可检测超过 961 个漏洞类别 支持所有主流平台、构建环境和 IDE。 Fortify SCA是一款商业软件&#xff0c;价格较为昂贵&#xf…

基金”中考”百亿基金经理”惜墨如金”

时下是基金二季报披露高峰&#xff0c;基民往往会期盼基金经理能在季报里带来“定心丸”。但个别基金经理的投资分析仅一两百字带过&#xff0c;对业绩亏损和调仓思路等关键问题更是直接忽略。 券商中国记者发现&#xff0c;有管理规模超370亿的基金经理&#xff0c;投资运作分…

ZohoProjects入选2022年度项目及项目组合管理类

有效的项目管理方法保证项目按照进度、成本、质量要求进行交付&#xff0c;是针对单个项目或项目群的管理&#xff0c;从而确保项目符合企业的战略目标&#xff0c;实现企业收益最大化。 对于项目管理工作来说&#xff0c;我们通常会认为只有专业的经理才能胜任&#xff0c;软件…

【每日一题】—— C. Game with Reversing (Codeforces Round 879 (Div. 2))

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

flask框架的请求处理逻辑

Django 和 Flask 是 Python 的两个非常流行的 Web 框架&#xff0c;它们对 HTTP 请求的处理方式有一些区别。 在 Django 中&#xff0c;当你的应用接收到一个 HTTP 请求时&#xff0c;Django 会将请求封装为一个 HttpRequest 对象&#xff0c;然后通过视图函数的参数传递这个对…

【计算机网络】简易TCP网络小程序

文章目录 1. 简易TCP网络程序1.1 服务端1.1.1 服务端创建套接字1.1.2 服务端绑定1.1.3 服务端监听1.1.4 服务端获取连接1.1.5 服务端处理请求 1.2 客户端1.2.1 客户端创建套接字1.2.2 客户端连接服务器1.2.3 客户端发起请求 1.3 服务器测试1.4 单执行流服务器的弊端 2. 多进程版…

【个人笔记】Linux的用户登录与退出

目录 Linux 的发行版Linux 的登录1.命令行登录2.ssh登录3.图形界面登录图形模式与文字模式的切换方式 Linux 的退出Linux 的关机与重启Linux 查看用户登录Linux在线命令工具 Linux 的发行版 Linux 的发行版说简单点就是将 Linux 内核与应用软件做一个打包。 目前市面上较知名…

使用Spring Boot实现Redis键过期回调功能

使用Spring Boot实现Redis键过期回调功能 当使用Redis作为缓存或数据存储的时候&#xff0c;有时候需要在键过期时执行一些特定的操作&#xff0c;比如清除相关数据或发送通知。在Spring Boot中&#xff0c;可以通过实现RedisMessageListener接口来实现Redis键过期回调功能。下…

任务的综合应用

需求 创建 4 个任务&#xff1a;TaskLED_1&#xff0c;TaskLED_2&#xff0c;TaskKEY_1&#xff0c;TaskKEY_2 任务要求如下&#xff1a; TaskLED_1&#xff1a;间隔 500ms 闪烁 LED1 TaskLED_2&#xff1a;间隔 1000ms 闪烁 LED2 TaskKEY_1&#xff1a;如果 taskLED1 存在…

Windows10强制删除文件或文件夹内容

一、需求描述 我们的Windows电脑中,会存在一些特殊的应用场景比如【(文件、文件夹)被读写保护、隐藏、或被程序一直占用、被感染了病毒】导致无法删除;此时候就需要采取强制删除的方式解决。 二、需求分析 文件、文件夹被占用,无法正常删除;但是有需要强制删除。 三、解…

安全攻击 --- XSS攻击

XSS跨站脚本攻击 &#xff08;1&#xff09;简介 OWASP TOP 10 之一&#xff0c;XSS被称为跨站脚本攻击&#xff08;Cross-Site-Scripting&#xff09;主要基于JavaScript&#xff08;JS&#xff09;完成攻击行为XSS通过精心构造JS代码注入到网页中&#xff0c;并由浏览器解释…

生态合作丨MemFireDB通过麒麟软件NeoCertify认证

近日&#xff0c;敏博科技“MemFireDB分布式关系数据库系统V2.8”与麒麟软件“银河麒麟高级服务器操作系统V10” 完成兼容性测试&#xff0c;获得麒麟软件 NeoCertify 认证证书。测试结果显示&#xff0c;MemFireDB数据库在国产操作系统上运行稳定&#xff0c;产品已经达到通用…

曲线拟合曲面拟合(MATLAB拟合工具箱)前馈量计算(压力闭环控制应用)

利用PLC进行压力闭环控制的项目背景介绍请查看下面文章链接,这里不再赘述。 信捷PLC压力闭环控制应用(C语言完整PD、PID源代码)_RXXW_Dor的博客-CSDN博客闭环控制的系列文章,可以查看PID专栏的的系列文章,链接如下:张力控制之速度闭环(速度前馈量计算)_RXXW_Dor的博客-CSD…

Windows下Python调用海康SDK实时显示网络摄像头

参考资源&#xff1a; 1.《Windows下Python调用海康SDK实时显示网络摄像头》 2.《HikVision SDK: C 至 Python》 3.《linux下Python调用海康SDK实时显示网络摄像头》 4.《python调用海康sdk操作热成像设备获取对应点温度》 5.《Windows下Python调用海康SDK实时视频流获取》 6.《…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)六:后台主页功能实现下

一、本章内容 接上一章,继续实现后端主页内容,主要实现工具栏对应相关内容的实现,包括系统消息、系统公告、全屏切换、语言切换、主题切换等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 基于VUE3+Layui从头搭建通用后台管理系统合集…

(五)RabbitMQ-进阶 死信队列、延迟队列、防丢失机制

Lison <dreamlison163.com>, v1.0.0, 2023.06.23 RabbitMQ-进阶 死信队列、延迟队列、防丢失机制 文章目录 RabbitMQ-进阶 死信队列、延迟队列、防丢失机制死信队列延迟队列延迟队列介绍**延迟队列_死信队列_的实现**延迟队列_插件实现下载插件RabbitMQ 配置类RabbitMQ …

知网的caj格式怎么转化成pdf格式?两个方法简单快捷!

在使用知网等学术资源时&#xff0c;我们常常会遇到CAJ格式的文件&#xff0c;然而CAJ格式并不是常见的文件格式&#xff0c;给我们的查阅和分享带来一些不便。为了更方便地处理这些文件&#xff0c;我们可以将其转换为常见的PDF格式。在本文中&#xff0c;我将为您介绍两种简单…

Docker——网络原理

Docker——网络 一、Docker 网络1&#xff0e;Docker 网络实现原理2&#xff0e;Docker 的网络模式 二、网络模式详解1&#xff0e;host模式2&#xff0e;container模式3&#xff0e;none模式4&#xff0e;bridge模式5&#xff0e;自定义网络 三、资源控制1&#xff0e;CPU 资源…

做测开的3年总结

大家好&#xff0c;我是洋子 进入测试行业刚满3年了&#xff0c;毕业北漂也满3年了&#xff0c;回顾一下这3年的工作和生活 下面文章我将会从QA这个岗位的角度复盘一下这3年来的所思所想&#xff0c;有刚入行的小伙伴可能不太清楚QA&#xff08;Quality Assurance&#xff09…