java queue 最大值_[剑指offer题解]队列的最大值/滑动窗口的最大值

3a69d06dd28f88ec6ca6e88e9afe54c7.png

前言

众所周知,《剑指offer》是一本“好书”。

为什么这么说?

因为在技术面试中,它里面罗列的算法题在面试中出现的频率是非常非常高的。

有多高,以我目前不多的面试来看,在所有遇到的面试算法题中,出现原题的概率大概能有6成,如果把基于原题的变种题目算上,那么这个出现概率能到达9成,10题中9题见过。

至于为什么给“好书”这两个字打引号,因为这本书成了面试官的必备,如果考生不会这本书上的题目,就很可能得到面试官负面的评价。这本书快要成为评判学生算法能力的唯一标准,这使得考前突击变成了一个惯例,反而让投机倒把成了必要,并不一定能真正的考察考生的算法能力。

对于剑指offer题解这个系列,我的写文章思路是,对于看了文章的读者,能够:

迅速了解该题常见解答思路(奇技淫巧不包括在内,节省大家时间,实在有研究需求的人可以查阅其它资料)

思路尽量贴近原书(例如书中提到的面试官经常会要求不改变原数组,或者有空间限制等,尽量体现在代码中,保证读者可以不漏掉书中细节)

尽量精简话语,避免冗长解释

给出代码可运行,注释齐全,对细节进行解释

快速找到我的《剑指offer题解》专栏:

公众号(Rude3Knife):底部导航栏——剑指offer题解

CSDN(@Rude3Knife):剑指offer题解专栏

题目介绍

剑指offer面试题59题

给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,得到最大值。对于长度为n的数组,算法时间复杂度O(nk)

显然不是最优解。

方法二:用两个栈实现队列

思路

面试题30中,我们实现过用两个栈实现了队列,可以在O(1)时间得到栈的最大值,也就可以得到队列的最大值。

这样总的时间复杂度O(n)

但是这样的思路写代码,等于同时要写两个题目,面试时间可能不允许。

方法三:双端队列

思路

参考解释:

数组的第一个数字是2,把它存入队列中。第二个数字是3,比2大,所以2不可能是滑动窗口中的最大值,因此把2从队列里删除,再把3存入队列中。第三个数字是4,比3大,同样的删3存4。此时滑动窗口中已经有3个数字,而它的最大值4位于队列的头部。

第四个数字2比4小,但是当4滑出之后它还是有可能成为最大值的,所以我们把2存入队列的尾部。下一个数字是6,比4和2都大,删4和2,存6。就这样依次进行,最大值永远位于队列的头部。

但是我们怎样判断滑动窗口是否包括一个数字?应该在队列里存入数字在数组里的下标,而不是数值。当一个数字的下标与当前处理的数字的下标之差大于或者相等于滑动窗口大小时,这个数字已经从窗口中滑出,可以从队列头部把它删除。因此,我们既有可能从头部删除数字,又可能从尾部删除数字,所以要双端队列。

488d9b7c7d01f0a3e079728e44ec814f.png

代码

注意点:

ArrayDeque的几个API:pollFirst、peekFirst等

ArrayDeque保存的是下标

最新的数的下标是必定加进去的。

import java.util.ArrayList;

import java.util.ArrayDeque;

public class Solution {

public ArrayList maxInWindows(int [] num, int size)

{

ArrayList result = new ArrayList<>();

// 排除特殊情况,窗口的长度为0

if (size==0) return result;

// 滑动窗口最左边数的index

int begin;

// 建立一个双端队列

ArrayDeque q = new ArrayDeque<>();

for(int i=0;i

// begin是窗口起始位置

begin = i-size+1;

// 队列空,直接加入

if(q.isEmpty())

q.add(i);

// 若队列最左边值已经不在窗口内,直接删除

else if(begin > q.peekFirst())

q.pollFirst();

// 从队尾开始比较,把所有比他小的值丢掉

while((!q.isEmpty()) && num[q.peekLast()] <= num[i])

q.pollLast();

// 随后再把它放进去

q.add(i);

// 若窗口起始位置在数组的0位置上或者之后(窗口是完整大小的),才计算窗口的有效最大值

if(begin>=0){

// 永远是队列最左边最大,加入结果集

result.add(num[q.peekFirst()]);

}

}

return result;

}

}

总结

采用双端队列,非常巧妙地一题。

关注我

我目前是一名后端开发工程师。技术领域主要关注后端开发,数据爬虫,数据安全,5G,物联网等方向。

微信:yangzd1102

Github:@qqxx6661

个人博客:

CSDN:@qqxx6661

知乎:@Zhendong

简书:@蛮三刀把刀

掘金:@蛮三刀把刀

原创博客主要内容

Java知识点复习全手册

Leetcode算法题解析

剑指offer算法题解析

SpringCloud菜鸟入门实战系列

SpringBoot菜鸟入门实战系列

Python爬虫相关技术文章

后端开发相关技术文章

个人公众号:Rude3Knife

个人公众号:Rude3Knife

如果文章对你有帮助,不妨收藏起来并转发给您的朋友们~

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

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

相关文章

PP视频怎么设置文件的缓存路径

软件是否好用&#xff0c;还得大家下载PP视频安装才知道。本文分享PP视频怎么设置文件的缓存路径。作为国内首家&#xff0c;全力打造正版视频平台的PP视频&#xff0c;将从流畅的观映体验、高清的视觉效果、贴心的分享感受等多个方面将“品质”做到极致&#xff0c;满足用户不…

java jvm 加载类的顺序_由经典面试题看java中类的加载机制

原标题&#xff1a;由经典面试题看java中类的加载机制1.概述类加载是Java程序运行的第一步&#xff0c;研究类的加载有助于了解JVM执行过程&#xff0c;并指导开发者采取更有效的措施配合程序执行&#xff0c;对理解java虚拟机的连接模型和java语言的动态性都有很大帮助。由于J…

联想一键恢复系统教程

联想一键恢复系统教程?下面我们来看一看吧。 联想不同类型的电脑进入一键恢复界面的方法不一&#xff0c;台式机一体机就在电脑开机出现联想logo界面时按下FnF2组合键。 联想一键恢复系统教程 笔记本则寻找一键恢复按键&#xff0c;在电脑电源关闭的情况下按住几秒钟即可进…

java 中的单引号报错_shell中的单引号,双引号,反引号

docker的父镜像中定义了一个环境变量&#xff0c;我们的镜像在启动命令中需要用到这个环境变量。但是不加双引号时总是报错&#xff0c;报找不到java的启动类&#xff0c;加上双引号就不报错了。父镜像中定义的变量&#xff1a;$xxx_CMD -Xdump:tool:eventssysthrow,optsASYNC…

腾讯视频怎么开启禁止界面硬件加速

本文小编给大家分享“腾讯视频怎么开启禁止界面硬件加速”。腾讯视频播放器下载界面设计、功能操作使用、启动播放速度、视频内容数量、画面品质等方面均得到了用户的高度认可。相对于其他几大视频播放器来说&#xff0c;腾讯视频会员性价比还是比较高的&#xff0c;这点&#…

java多线程论文_Java5 多线程之入门篇-论文

Java5 多线程之入门篇Java5 多线程之入门篇首先回顾一下JDK1.5之前的线程相关的知识:1 线程的入门.什么是线程,线程就是程序执行的线索,Java是面向对象的语言什么类来表示这样一个东西呢?Thread.通过start()方法启动它,线程所要执行的任务放在run()方法里面,下面可以看一下run…

xp怎么升级到win7

使用云骑士软件前注意电脑磁盘至少要2个以上&#xff0c;同时备份好C盘上的重要资料&#xff0c;包括桌面文件和聊天记录等等。 打开浏览器&#xff0c;在云骑士官网下载云骑士一键重装系统软件&#xff0c;下载好以后打开云骑士装机大师&#xff0c;点击一键装机页面下的立即…

brew php7 intl_brew安装php7

设置brewbrew tap homebrew/dupesbrew tap homebrew/versionsbrew tap homebrew/homebrew-php安装php7brew install php70 \--without-snmp \--without-apache \--with-debug \--with-fpm \--with-intl \--with-homebrew-curl \--with-homebrew-libxslt \--with-homebrew-opens…

电脑怎么备份系统

电脑怎么备份系统?下面就与大家分享电脑备份系统的方法。 可以使用电脑的备份功能。 1 第一步 右键点击此电脑&#xff0c;选择属性&#xff0c;选择左侧菜单中的系统保护选项 电脑怎么备份系统 电脑怎么备份系统(1) 2 第二步 点击配置&#xff0c;勾选启用系统保护&#…

php求北京时间方法,php怎么将获得的时间转换为北京时间

从php5.10开始&#xff0c;php中加入了时区的设置&#xff0c;在php中显示的时间都是格林威治标准时间&#xff0c;这就造成了我们中国的用户会差八个小时的问题&#xff01;相关设置是修改php.ini中的 date.timezone 参数&#xff1a;[Date]; Defines the default timezone us…

php sql desc,PHP SQL 查询封装

/*** SQL 简单查询工具类* * $tools new SQLTools("表名", "数据库操作对象实例");*$tools->query("字段默认为*") //(如无后续操作此处返回查询结果集)* ->where( 条件, PDO参数化查询参数 ) //(如无后续操作此处返回查询结果集)* ->…

彩虹浏览器使用技巧:页签自动切换

核心提示&#xff1a;彩虹66760设计了创新的页签自动切换功能&#xff0c;当鼠标移动到某个页签时&#xff0c;无需要点击就能自动激活您所想打开的网页&#xff0c;这个功能是不是很酷很炫呢&#xff0c;为大家节约一点小时间。 1&#xff0c;悬停换页 彩虹浏览器设计了创新…

php 的不等于符号,mysql 不等于 符号写法

经过测试发现mysql中用<>与!都是可以的&#xff0c;但sqlserver中不识别!,所以建议用<>selece * from zzvips where id<>45sql 里 符号<> 于 ! 的区别<> 与!都是不等于的意思&#xff0c;但是一般都是用<>来代码不等于因为<>在任何S…

腾讯视频怎么禁止别人登录我的会员

一旦你有了腾讯视频的vip会员账号&#xff0c;那么不管你是朋友眼中&#xff0c;还是在那些盗号的眼中&#xff0c;你就是非常诱人的&#xff0c;那么我们怎么设置才能够禁止别人登录自己的会员账号呢?跟着小编的节奏&#xff0c;带你安全设置腾讯视频vip账号。 首先&#xf…

php数组交集方法,PHP获得数组交集与差集的方法

本文实例讲述了PHP获得数组交集与差集的方法。分享给大家供大家参考。具体分析如下&#xff1a;一、数组的交集 array_intersect()array_intersect()函数返回一个保留了键的数组&#xff0c;这个数组只由第一个数组中出现的且在其他每个输入数组中都出现的值组成。其形式如下&a…

如何获取优酷视频的通用代码?

在网站建设中&#xff0c;假如置入视頻&#xff0c;则必须该视頻所属视频平台的通用性编码&#xff0c;比如某一视频在优酷网的通用性编码。拷贝该通用性编码在自身的网址&#xff0c;大家就可以自身在自身网址收看&#xff0c;无需自动跳转优酷网站。如何获取优酷视频的通用代…

一般java,【面试题】java一般

1、取最大最小值public static int maxOrMinTest(List list){Integer[] integers list.toArray(new Integer[0]);int max integers[0];for (int a1;aif (max < integers[a]){max integers[a];}}return max;}2、冒泡排序public static List sortTest(List list){Integer[]…

如何在金山毒霸软件里安装腾讯视频

有很多软件管理工具&#xff0c;金山毒霸不仅仅是杀毒软件&#xff0c;也是软件管理工具&#xff0c;对于一些电脑小白用户来说&#xff0c;在这里也可以非常方便的一键下载安装自己想要的软件&#xff0c;比如腾讯视频&#xff0c;这个其实和360软件管家是一样的道理&#xff…

java使用wsdlreader,Java WSDLReader.setFeature方法代碼示例

本文整理匯總了Java中javax.wsdl.xml.WSDLReader.setFeature方法的典型用法代碼示例。如果您正苦於以下問題&#xff1a;Java WSDLReader.setFeature方法的具體用法&#xff1f;Java WSDLReader.setFeature怎麽用&#xff1f;Java WSDLReader.setFeature使用的例子&#xff1f;…

如何进行系统还原

在我们使用电脑的时候有时候要对系统进行还原&#xff0c;那么你知道如何进行系统还原吗?不知道的小伙伴一起来操作一遍吧。 1 第一步 鼠标单击左下角的开始菜单&#xff0c;选择设置&#xff0c;进入页面 如何进行系统还原 2 第二步 单击更新和安全&#xff0c;选择左侧的恢…