滑动窗口的最大值java

2023-11-11

 

题目描述:

  给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

  解题思路:

  如果不考虑时间开销,使用蛮力法,本题并不难解决,依次遍历所有的滑动窗口,扫描每个窗口中的所有数字并找出其中的最大值,这都很容易实现,但是如果滑动窗口的大小为k,那么需要O(k)的时间找最大值,对于长度为n大的数组,总的时间复杂度为O(nk)。

  然后我们考虑进一步优化,一个滑动窗口实际上可以看成一个队列。当窗口滑动时,处于窗口第一个位置的数字被删除,同时在窗口的末尾又增加了一个新的数字。这符合队列“先进先出”的特性。

  在第20题:包含min函数的栈,我们使用两个栈实现了一个求最小值的栈,在O(1)时间内可以得到最小值,这里我们可以改为求最大值,同样可以在O(1)时间内得到最大值,而这里的数据用队列保存,我们可以用两个栈实现队列,这就是第5题:用两个栈实现队列。这样,实际上综合这两题我们可以解决本题,总的时间复杂度也可以降到O(n)。

  这里我们换用另外一种方法:使用双端队列。我们不把所有的值都加入滑动窗口,而是只把有可能成为最大值的数加入滑动窗口。这就需要一个两边都可以操作的双向队列。

  我们以数组{2,3,4,2,6,2,5,1}为例,滑动窗口大小为3,先把第一个数字2加入队列,第二个数字是3,比2大,所以2不可能是最大值,所以把2删除,3存入队列。第三个数是4,比3大,同样删3存4,此时滑动窗口以遍历三个数字,最大值4在队列的头部。

  第4个数字是2,比队列中的数字4小,当4滑出去以后,2还是有可能成为最大值的,因此将2加入队列尾部,此时最大值4仍在队列的头部。

  第五个数字是6,队列的数字4和2都比它小,所以删掉4和2,将6存入队列尾部,此时最大值6在队列头部。

  第六个数字是2,此时队列中的数6比2大,所以2以后还有可能是最大值,所以加入队列尾部,此时最大值6在仍然队列头部。

  ······

  依次进行,这样每次的最大值都在队列头部。

  还有一点需要注意的是:如果后面的数字都比前面的小,那么加入到队列中的数可能超过窗口大小,这时需要判断滑动窗口是否包含队头的这个元素,为了进行这个检查,我们可以在队列中存储数字在数组中的下标,而不是数值,当一个数字的下标和当前出来的数字下标之差大于等于滑动窗口的大小时,这个元素就应该从队列中删除。

  举例:

  编程实现(Java):

import java.util.*;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size){
        /*
        思路:用双端队列实现
        */
        ArrayList<Integer> res=new ArrayList<>();
        if(num==null || num.length<1 || size<=0 || size>num.length)
            return res;
        Deque<Integer> queue=new LinkedList<>();
        for(int i=0;i<num.length;i++){
            while(!queue.isEmpty() && queue.peek()<i-size+1) //超出范围的去掉
                 queue.poll();
            //当前值大于之前的值,之前的不可能是最大值,可以删掉
            while(!queue.isEmpty() && num[i]>=num[queue.getLast()]) 
                 queue.removeLast();
            queue.add(i);
            if(i>=size-1){ //此时开始是第一个滑动窗口
                res.add(num[queue.peek()]);
            }
        }
        return res;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

滑动窗口的最大值java 的相关文章

随机推荐

  • centos系统把.net6 web api部署到docker

    为了搞定docker是怎么部署的 做个笔记 前提条件 准备一个core项目 使用vs自带的docker打包 假如你选择docker支持的时候不小心安装了Docker Desktop 还可以简单的先部署到本地docker中 发布到centos
  • Python-Scrapy安装

    描述 安装爬虫框架Scrapy 基本使用 知识点总结 目录 一 Scrapy安装 1 1 scrapy是什么 1 2 安装环境 1 3 步骤安装 1 4 测试是否安装成功 1 4 第三方库 一 Scrapy安装 1 1 scrapy是什么
  • .NetCore之log4net的使用

    1 首先下载log4ne的包 2 添加配置文件log4net config
  • CodeWhisperer的注册、安装与使用指南。

    CodeWhisperer是一款功能强大的代码编辑器 它支持多种编程语言 并提供了许多有用的编辑和调试功能 下面是使用CodeWhisperer 需要进行注册 安装和使用 下面是详细的指南 一 注册CodeWhisperer 在使用Code
  • [物联网方案-3]:井下作业需要检测气体类型与常见的传感器

    井下作业的主要职业危险是缺氧窒息 一氧化碳 硫化氢中毒和可燃气爆炸 其中最常见的现象是硫化氢中毒 复合式四合一气体检测仪能及时检测出井内有毒有害气体的浓度 并能自动报警 1 一氧化碳中毒 一氧化碳中毒 呼吸浅而急促 失去知觉时面颊及身上有红
  • TEASER

    本文是对文章 TEASER Fast and Certifiable Point Cloud Registration 的解读 摘要 这篇文章提出了第一个快速且可证明的算法 用于存在大量外点对应的情况下两组3D点的配准 可证明的算法尝试求解
  • Spring Boot 安全的最佳实践

    Spring Boot 安全的最佳实践 在 Web 应用程序中 安全性是至关重要的 恶意攻击者可能会利用您的应用程序中的弱点来获取敏感信息或者窃取用户数据 为了保护您的应用程序和用户数据 您需要遵循一些最佳实践 本文将介绍 Spring B
  • C#简单的制作一个窗体应用

    废话少说下面先看效果 登陆管理员 注册账号和管理账号 修改密码界面 功能界面 功能一 连接中国移动物联网平台检测温湿度 输入wendu可以查询 功能二 查看图片 功能三 读写通知管理员可以写但普通成员只可以读 功能四 计算工具 可以计算三角
  • 一百四十六、Xmanager——Xmanager5连接Xshell7并控制服务器桌面

    一 目的 由于kettle安装在Linux上 Xshell启动后需要Xmanager 而Xmanager7版本受限 没有免费版 所以就用Xmanager5去连接Xshell7 二 Xmanager5安装包来源 一 注册码 注册码 10121
  • Linux——TCP传输可靠性

    TCP传输可靠性的前提条件 重传机制 针对数据包丢失或者出现定时器超时 确认应答 停止等待协议 发送之后等待收到应答 序列号 针对数据包到达接收端主机顺序乱掉 流量控制 针对避免网络拥堵时候 针对高效传输数据包的流动窗口的控制 拥塞控制 针
  • qt中Graphic中 View的坐标和Scene的坐标不匹配的问题

    在QT中使用QGraphicView 和QGraphicsSce 时 会遇到一个这样一个问题 Scene中绘制图的坐标与View显示坐标不符 例如 直接在scene中添加直线 并且设置起点是0 0 但是我们会发现他的起点并不是0 0 如下图
  • 【数据结构入门】队列(Queue)详解(定义、销毁、入队、出队等)

    文章目录 1 前言 1 队列的概念 2 队列的结构 2 队列的实现 链式结构 1 队列的定义 2 队列的初始化 3 队列的销毁 4 入队 尾插 5 出队 头删 6 获取队列元素个数 7 获取队头元素 8 获取队尾元素 9 检查队列是否为空
  • Qt 获取程序所在路径等特殊路径的方法

    目录 经常我们的程序中需要访问一些特殊的路径 比如程序所在的路径 用户目录路径 临时文件夹等 在 Qt 中实现这几个功能所用的方法虽然都不难 但是各不相同 每次用到时还要现去查 很不方便 因此就写了这篇博客 把这几种需求的实现方式总结了一下
  • 2022春招前端最新面试题分享(牧原股份)

    牧原股份 公司及岗位信息 公司 牧原股份 岗位 前端开发工程师 地点 河南 薪资 12k 16k 面试结果 一面后暂时未接到通知 一面HR技术群面 2022 04 19 自我介绍 期望薪资 你认为你为什么值这个钱 JS常用的数据类型 分辨引
  • Spring Boot(一)

    什么是Spring Boot Spring Boot 是由 Pivotal 团队提供的全新框架 其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程 该框架使用了特定的方式来进行配置 从而使开发人员不再需要定义样板化的配置 Sp
  • UG10.0安装方法及步骤

    1 右击软件压缩包 选择解压到 UG10 64bit 选项 2 打开破解文件夹下的NX10 0 JAVA X64位exe文件 3 然后点下一步 4 下一步 5 选择安装目录 默认安装在 C Program Files Java jdk18
  • 面试华为,花了2个月才上岸,真的难呀····

    花2个月时间面试一家公司 你们觉得值吗 背景介绍 美本计算机专业 代码能力一般 之前有过两段实习以及一个学校项目经历 第一份实习是大二暑期在深圳的一家互联网公司做前端开发 第二份实习由于大三暑假回国的时间比较短 小于两个月 于是找的实习是在
  • 最大化期望算法(EM)详解

    我们知道最大似然估计的根本目的是根据抽样的到的样本 即数据 反推出最有可能的分布参数 即模型 这是一个非常典型的机器学习的思想 所以在很多领域最大似然估计有着极为广泛的应用 然而 如果已知的数据中含有某些无法观测的隐藏变量时 直接使用最大似
  • 手写Vue个人组件库———fl-Cascader

    您好 如果喜欢我的文章 可以关注我的公众号 量子前端 将不定期关注推送前端好文 接上文 封装了个人Vue组件库的Cascader级联选择器 源码附在了文章末尾 如下是文档使用说明 Cascader 级联选择器 当一个数据集合有清晰的层级结构
  • 滑动窗口的最大值java

    题目描述 给定一个数组和滑动窗口的大小 找出所有滑动窗口里数值的最大值 例如 如果输入数组 2 3 4 2 6 2 5 1 及滑动窗口的大小3 那么一共存在6个滑动窗口 他们的最大值分别为 4 4 6 6 6 5 针对数组 2 3 4 2