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,一经查实,立即删除!

相关文章

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

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

php数据库可转java数据库,php转java 系列2 Spring boo 链接数据库jdbc

php转java 系列2 Spring boo 链接数据库jdbcJDBC首先创建一个新项目&#xff0c;在创建项目时要注意导入依赖&#xff0c;在项目创建成功后就会看到在 pom.xml 文件中找到&#xff0c;但是如果在创建项目的时候没有导入&#xff0c;就要在pom.xml中手动的添加依赖&#xff1b;o…

php连接excel表格数据类型,TP5 中使用PHPExcel 导出导入数据到excel表格

将下载好的PHPExcel文件夹放置在框架中的Vendor目录下&#xff0c;注意目录的结构&#xff0c;按照我的代码来基本上直接引用就能使用&#xff0c;如下图&#xff1a;导出数据代码如下//导出数据表 开始public function product(){$listdb(product)->select();vendor("…

oracle导致的负载高,Oracle 11g 数据库服务器CPU、IO负载高的故障排除流程

使用top查看负载高的进程~ [OSMSRDB]$ toptop - 11:02:43 up 12 days, 17:15, 4 users, load average: 1.50, 0.93, 0.36Tasks: 363 total, 1 running, 362 sleeping, 0 stopped, 0 zombieCpu(s): 1.2%us, 0.3%sy, 0.0%ni, 68.4%id,30.1%wa, 0.0%hi, 0.0%si, 0.0…

清理linux 服务器的命令行,使用Linux上的Magic SysRq键修复冻结的X服务器,清理重新启动并运行其他低级命令 | MOS86...

在Linux中&#xff0c;魔术SysRq键可以直接发送命令到Linux内核。您可以使用它来恢复冻结或干净地重新启动系统&#xff0c;即使没有任何反应。魔术SysRq键是作为Linux键盘驱动程序的一部分实现的 - 只要Linux内核仍在运行&#xff0c;它将会工作。只有内核崩溃才能禁用此组合键…

上海电力大学c语言程序设计章测试,上海电力学院c语言报告:实验8 指针.doc

上海电力学院c语言报告&#xff1a;实验8 指针.doc下载提示(请认真阅读)1.请仔细阅读文档&#xff0c;确保文档完整性&#xff0c;对于不预览、不比对内容而直接下载带来的问题本站不予受理。2.下载的文档&#xff0c;不会出现我们的网址水印。3、该文档所得收入(下载内容预览)…

python c语言 数据类型转换,Python类型转换,数据类型转换函数大全

虽然 Python 是弱类型编程语言&#xff0c;不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型&#xff0c;但在一些特定场景中&#xff0c;仍然需要用到类型转换。比如说&#xff0c;我们想通过使用 print() 函数输出信息“您的身高&#xff1a;”以及浮点类型 heigh…

新闻发布系统C语言,资讯 | 助力期末之c语言专场圆满结束!

原标题&#xff1a;资讯 | "助力期末"之c语言专场圆满结束&#xff01;大一生活如白驹过隙&#xff0c;一转眼便来到了期末&#xff0c;相信很多同学都对c语言期末考很在意&#xff0c;但是又不知道考点在哪里&#xff0c;感觉很多知识点都还不太清楚。确实&#xff…

android创建空文件,ADT 更新 eclipse srclayout 文件夹创建时候为空

今天是14-3-9&#xff0c;发现SDK Manager有更新&#xff0c;手贱点了一下。。。然后新建项目src和layout文件夹就成空的了。。。虽然可以手动建立内容&#xff0c;但是感觉很不爽&#xff0c;到处找解决方法&#xff0c;最后在贴吧找到了&#xff0c;内容链接到了eoe&#xff…

html语言循环语句,Scala @功能/语言的HTML文档 - for循环,如果语句等

我正在一个控制器的视图(HTML页面)中&#xff0c;我试图匹配复选框中的“选中”值的列表中。Scala 功能/语言的HTML文档 - for循环&#xff0c;如果语句等我从模型中抓取选定的复选框值(列表A)&#xff0c;将它们在控制器中抓取并发送到视图。我还从模型中获取复选框选择/选项/…

百度自动推送html5,百度暂停 JS 代码自动推送功能,代码是否需要删除?

本月上旬末的时候百度站长平台就推送了一则关于&#xff1a;搜索资源平台自动推送暂停使用通知。说到由于升级维护&#xff0c;搜索资源平台链接提交-自动提交-自动推送(JS 代码推送)功能暂时停止使用。并且会在恢复使用时再次通知。由于这条通知是百度通过搜索资源平台发送的站…

html中表格布局还是div布局,Table布局 VS Div+CSS布局,选哪个?

Table布局 和 DivCSS布局的争论&#xff0c;过了7-8年了&#xff0c;今天看到一篇文章《为什么我们不建议用Table布局》&#xff0c;又想发表下自己的见解&#xff0c;供初学《为什么我们不建议用Table布局》节选&#xff1a;Table要比其它html标记占更多的字节。(延迟下载时间…

计算机桌面锁写快捷,电脑如何锁屏幕 锁屏快捷键是什么

锁屏幕是用户们日常生活中的必备玩法,很多玩家们却不知道游戏中应该如何锁屏幕,那么具体应该如何锁屏幕呢?下面小编带大家一起来看下电脑如何锁屏幕吧!电脑怎么锁屏幕?电脑如何锁屏幕?1、首先自然是需要为电脑创建一个密码。点击开始按钮&#xff0c;然后找到控制面板&#…

计算机在军事的应用论文,信息技术论文3000字【军事信息技术论文】

信息技术是20世纪科学技术发展最重大&#xff0c;最辉煌的成就之一&#xff0c;下面是小编为大家精心推荐的军事信息技术论文&#xff0c;希望能够对您有所帮助。军事信息技术论文篇一漫谈信息技术【摘 要】本文研究了信息技术的发展历程&#xff0c;阐述了信息技术的涵义及研究…

计算机组成原理环境配置,计算机组成原理课程设计

《计算机组成原理》实验大纲适用专业&#xff1a;计算机科学与技术(本科)、网络工程(本科)实验学时&#xff1a;16学时学分&#xff1a;0.5学分一、实验课程目的与要求(1) 进一步融会贯通教材内容&#xff0c;掌握计算机各功能模块的工作原理、相互联系和来龙去脉&#xff0c;完…

计算机学业水平测试初中生操作题,初中学业水平考试信息技术考试操作题常见题型及作答方法...

初中信息技术考试操作题常见题型及作答方法牛角寨乡初级中学信息技术考试已经有两年了&#xff0c;通过这两年的考试情况来看&#xff0c;我认为&#xff0c;要想在信息技术考试中取得一个好的成绩&#xff0c;操作题是一个很重要的环节&#xff0c;从这两年的情况来看&#xf…

什么不是预防计算机病毒的方法,预防计算机病毒的方法是什么

对于电脑安全防护&#xff0c;最好的方法是将病毒扼杀在摇篮中&#xff0c;这就需要积极预防病毒&#xff0c;提前发现并查杀病毒。下面就让学习啦小编给大家说说预防计算机病毒的方法是什么吧。预防计算机病毒的方法第一、及时为Windows打补丁为Windows打补丁是很重要的&#…

手机在线测试黄疸软件,在家怎么用手机测黄疸

文章导读新生婴儿遭遇的问题中最普遍的便是黄疸&#xff0c;新生儿黄疸绝大多数都归属于生理性的&#xff0c;不需要独特医治&#xff0c;还可以在医师具体指导下服食用药治疗&#xff0c;在平常一定要多给宝宝晒太阳。有的病人出世以后黄疸指数不比较严重&#xff0c;可是住院…

怎么解决计算机键盘驱动,解决键盘失灵、安装更新键盘驱动方法

怎样重新安装电脑键盘驱动第一步&#xff1a;点击打开“我的电脑”属性选项&#xff0c;选择硬件标签&#xff0c;打开设备管理器&#xff0c;点击打开“键盘选项”默认的键盘驱动是“标准101/102键或Microsoft自然PS/2键盘”。 右键...如何重装键盘驱动操作系统装好之后默认已…

java实现两台计算机的互联,如何用Java语言实现两台计算机之间的文件传输?

最近新学习了Java语言&#xff0c;算是一个小白&#xff0c;想用TCP Socket进行网络编程&#xff0c;使得服务器端接受客户端的文件&#xff0c;但是遇到了一个错误&#xff0c;有人知道该怎么解决吗&#xff1f;//这是服务器端的代码public class UploadServer {public static…