【双端队列】【维护单调队列】Leetcode 239 滑动窗口最大值【难】

【双端队列】Leetcode 239 滑动窗口最大值

    • 双端队列的操作
    • 解法1 利用双端队列实现单调队列

---------------🎈🎈题目链接 Leetcode 239 滑动窗口最大值🎈🎈-------------------

在这里插入图片描述

双端队列的操作

创建双端队列:Deque<Integer> mydeque = new Deque<>()
双端队列的队首元素:mydeque.peekFirst()
双端队列的队尾元素:mydeque.peekLast()
双端队列的队首元素弹出:mydeque.pollFirst()
双端队列的队尾元素弹出:mydeque.pollLast()
双端队列的队首元素加入:mydeque.addFirst()
双端队列的队尾元素加入:mydeque.addLast()

解法1 利用双端队列实现单调队列

首先,先从第一个滑动窗口开始维护一个单调队列:这里向队列内添加元素时,需要始终保证mydeque.peekLast() 大于 新添加的元素,即如果新添加的元素大于队列末尾的元素时,需要while弹出队列末尾元素(直到满足上述条件),之后再将新元素添加到队列末尾:mydeque.addLast(新元素)
其次,在窗口开始滑动的时候,每次滑动后,需要验证当前队列中队首元素(也就是目前队列中的最大元素)是否是在滑动中需要被踢出队列的元素(比如当前队列中的-3 1 3 再次进行滑动后 ——按照原数组位置来看3会被踢出):即判断mydeque.peekFirst() 是否等于 nums[i-k],若等于,则踢出队首元素后再进行第一步中的入队验证等一系列操作。
最后,从遍历的i>k-1开始,每次都要输出result[i-k+1] = mydeque.peekFirst() 即输出滑动窗口内的最大值至result数组。
在这里插入图片描述

时间复杂度O(N):使用单调队列的时间复杂度是 O(n)
空间复杂度O(K) :K就是自己维护的队列的长度

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        Deque<Integer> mydeque = new LinkedList<>();
        int[] result = new int[nums.length-k+1];

        int index = 0;
        for(int i = 0; i<nums.length; i++){
            // 弹出队列操作
            if(i > k-1 && mydeque.peekFirst() == nums[i-k]){
                mydeque.pollFirst();
            }

            // 入队列操作
            while(!mydeque.isEmpty() && mydeque.peekLast()<nums[i]){
                mydeque.pollLast();
            }
            mydeque.addLast(nums[i]);

            
            //得到队首值mydeque.peekFirst() 即为最大值
            if(i >= k-1){
                result[i-k+1] = mydeque.peekFirst();
            }
            
        }
        return result;
    }
}        
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决字符串类型转数字类型相加结果异常问题

js字符串类型转换数字类型有七种方法&#xff0c;分别是parseInt()&#xff0c;parseFloat()&#xff0c;Math.floor()&#xff0c;乘以数字&#xff08;*1&#xff09;&#xff0c;Number()&#xff0c;双波浪号 (~~number)&#xff0c;一元运算符&#xff08;number&#xff…

npm run dev 启动vue的时候指定端口

使用的是 Vue CLI 来创建和管理 Vue 项目&#xff0c; 可以通过设置 --port 参数来指定启动的端口号。以下是具体的步骤&#xff1a; 打开命令行终端 进入您的 Vue 项目目录 运行以下命令&#xff0c;通过 --port 参数指定端口号&#xff08;例如&#xff0c;这里设置端口号…

学习c语言,函数指针数组

上一个函数指针修改成函数数组

深入详解使用 RabbitMQ 过程中涉及到的多个细节问题(面试可用)

目录 1、基础类问题 2、cluster 相关问题 3、综合性问题 4、参考资料 C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/125529931C/C基础与进阶&…

三大3D引擎对比,直观感受AMRT3D渲染能力

作为当前热门的内容呈现形式&#xff0c;3D已经成为了广大开发者、设计师工作里不可或缺的一部分。 用户对于3D的热衷&#xff0c;源于其带来的【沉浸式体验】和【超仿真视觉效果】。借此我们从用户重点关注的四个3D视觉呈现内容&#xff1a; 材质- 呈现多元化内容水效果- 展…

Java开发的审批流系统,前端使用vue,支持常态化工作审批流程

一、项目形式 springbootvueactiviti集成了activiti在线编辑器&#xff0c;快速开发平台&#xff0c;可插拔工作流服务。 二、项目介绍 本项目拥有用户管理&#xff0c;部门管理&#xff0c;代码生成&#xff0c;系统监管&#xff0c;报表&#xff0c;大屏展示&#xff0c;业…

使用C语言实现模型的推理(一)

使用C语言实现模型的推理&#xff08;一&#xff09; WHY&#xff1f;思路整理从怎么把大象放到冰箱里开始怎么让模型推理跑起来 生成一个模型理清楚算子之间的依赖关系获取tensor信息获取依赖信息获取模型的运算图拓扑排序 TO DO其他biasDELEGATE WHY&#xff1f; 现在推理框…

2023预警名单

中国科学院文献情报中心期刊分区表-预警名单 2023年预警名单 2021年预警名单 官方没有2022年预警名单 2020年预警名单 每一年都有变化&#xff0c;今年在预警名单&#xff0c;明年可能就不在预警名单了&#xff0c;具体看学校要求&#xff0c;以及入学年份。

定义域【高数笔记】

【定义域】 1&#xff0c;{知识点} 对于一个函数&#xff0c;f(x)&#xff0c;"f"是起到两个作用&#xff0c;第一&#xff0c;是对自变量的范围的约束&#xff0c;第二&#xff0c;是对运算的约束&#xff0c;同一个"f" 就有同一个约束效果 2&#xff0c;…

离散数学学习要点——命题逻辑

文章目录 数理逻辑命题逻辑命题命题的种类命题的表示 逻辑连接词否定联结词合取联结词∧析取联结词∨或异或 条件➡等价&#xff08;双条件&#xff09;联结词↔联结词真值表 命题逻辑中的命题的符号化命题公式及其真值表命题公式真值表 命题公式的等价重言式与重言蕴含式重言式…

TypeScript依赖注入框架Typedi的使用、原理、源码解读

简介 typedi是一个基于TS的装饰器和reflect-metadata的依赖注入轻量级框架&#xff0c;使用简单易懂&#xff0c;方便拓展。 使用typedi的前提是安装reflect-metadata&#xff0c;并在项目的入口文件的第一行中声明import ‘reflect-metadata’&#xff0c;这样就会在原生的R…

大数据工作岗位需求分析

前言&#xff1a;随着大数据需求的增多&#xff0c;许多中小公司和团队也新增或扩展了大数据工作岗位&#xff1b;但是却对大数据要做什么和能做什么&#xff0c;没有深入的认识&#xff1b;往往是招了大数据岗位&#xff0c;搭建起基础能力后&#xff0c;就一直处于重复开发和…

分类预测 | Matlab实现ISSA-SVM基于多策略混合改进的麻雀搜索算法优化支持向量机的数据分类预测

分类预测 | Matlab实现ISSA-SVM基于多策略混合改进的麻雀搜索算法优化支持向量机的数据分类预测 目录 分类预测 | Matlab实现ISSA-SVM基于多策略混合改进的麻雀搜索算法优化支持向量机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 基于多策略混合改进的麻…

录课视频太大怎么办?3种方法一键瘦身~

录制视频是现代人常用的一种记录生活的方式&#xff0c;但是视频文件大小往往会很大&#xff0c;不利于存储和分享。为了解决这个问题&#xff0c;我们需要使用视频压缩软件来压缩视频文件大小&#xff0c;以便更方便地存储和分享。 方法一&#xff1a;嗨格式压缩大师 嗨格式压…

Lucas求大组合数C(n,m)%p

将大组合数C&#xff08;n,m&#xff09;%p分解为小组合数C&#xff08;n,m&#xff09;%p乘积的模&#xff0c;n<10^18,m<10^18。 其中求解小组合数可以根据定义式计算&#xff08;质因子分解&#xff09;&#xff0c;也可以通过定义式的变形计算&#xff08;逆元&…

如何使用Portainer部署web站点并实现无公网ip远程访问

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

【根据loss曲线看模型微调效果】如何使用loss曲线诊断机器学习模型性能

一、Loss曲线 在模型的预训练或者微调过程中&#xff0c;我们一般通过观察loss曲线来得出模型对于数据集的学习效果等信息。那么我们如何根据loss曲线得到一些信息呢&#xff1f; 通常数据集会被划分成三部分&#xff0c;训练集&#xff08;training dataset&#xff09;、验证…

Flask 项目怎么配置并创建第一个小项目?附上完成第一个小案例截图

目录 1. 为什么要学习 flask&#xff1f; 2. flask 是什么&#xff1f; 3. flask 如何使用&#xff1f; 要安装 Flask&#xff0c;可以按照以下步骤进行&#xff1a; 4. 使用流程 4.1. 新建项目 4.1.1. 打开 pycharm&#xff0c;新建项目 4.1.2. 设置目录&#xff0c;并…

解决系统开发中的跨域问题:CORS、JSONP、Nginx

文章目录 一、概述1.问题场景2.浏览器的同源策略3.解决思路 二、一点准备工作1.创建前端工程12.创建后端工程3.创建前端工程24.跨域问题 三、方法1&#xff1a;使用CORS四、方法2&#xff1a;JSONP五、方法3&#xff1a;Nginx1.安装和启动&#xff08;windows&#xff09;2.使用…

匿名/箭头函数,立即执行函数IIFE;函数声明式和函数表达式

目录 匿名/箭头函数&#xff1a;简洁 继承上一层作用域链的this 不绑定arguments,用rest参数 rest 参数&#xff1a;...真正的数组 因为没有function声明&#xff0c;所以没有原型prototype&#xff0c;所以不能作为构造函数 当函数体只有一句时&#xff0c;可省 return ,…