java 头尾 队列_记一次腾讯面试,我挂在了最熟悉不过的队列上
前记
面试官问:你了解队列和链表的区别吗?
我:了解,blabla
面试官又问:你能自己实现队列吗?具体讲讲怎么实现?
我当时说了用链表来实现队列的存储,并实现push和pop的操作,但回答的不具体,面试官有些摇头。今天结合一道力扣题来实现队列
面试
题目
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1。
示例 1:输入: ["MaxQueue","push_back","push_back","max_value","pop_front","max_value"][[],[1],[2],[],[],[]]输出: [null,null,null,2,1,2]
解题思路:双链表实现
max_value()
如果MAXQueueHead == MAXQueueTail 表示队列中没有元素,返回-1。在MAXQueue的头指针的位置保存的就是此时队列中的最大值,直接的取值就可以,时间复杂度是O(1)
push_back():
Queue数组正常的进行添加数据,Queue[QueueTail++] = value;
在进行入队的时候,在MAXQueue中需要进行判断,时间复杂度均摊下来也是O(1):比value小的值,一定会在value出栈前,先出栈,队列中的最大值最少都是value,就没有保存比value小的值的必要了,MAXQueueTail指向的索引,在数组MAXQueue中还没被赋值,判断的时候需要使用MAXQueueTail-1。MAXQueue[MAXQueueTail-1] < value
pop_front()
Queue中Head的值 与 MAXQueue中Head的值相等,则两个数组中的head都要 ++ ,因为最大值已经变了。不然,就是常规的Queue中的head++,时间复杂度是O(1)
解题代码(java)
class MaxQueue { List list; int listHead = 0; int listTail = 0; List MAXlist; int MAXlistHead = 0; int MAXlistTail = 0; public MaxQueue() { list = new ArrayList<>(); MAXlist = new ArrayList<>(); } public int max_value() { if(MAXlistHead == MAXlistTail){ // 头尾相等的时候,表示此时队列为空,没有最大值 return -1; } return MAXlist.get(MAXlistHead); } public void push_back(int value) { list.add(listTail++, value); while(MAXlistHead != MAXlistTail && MAXlist.get(MAXlistTail-1) < value){ // MAXlistTail-1 因为MAXlistTail处的值是0,还没有被初始化 // 比value小的值,一定会在value出栈前,先出栈, // 队列中的最大值最少都是value,就没有保存比value小的值的必要了 MAXlistTail--; } MAXlist.add(MAXlistTail++,value); } public int pop_front() { if(listHead == listTail){ // 队列为空 return -1; } int res = list.get(listHead); if(res == MAXlist.get(MAXlistHead)){ MAXlistHead++; } listHead++; return res; } }
java 头尾 队列_记一次腾讯面试,我挂在了最熟悉不过的队列上相关推荐
- html 如何实现一条竖线边上有 刻度_记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背||CSDN博文精选...
作者:帅地 有一次面试的时候,被问到进程之间有哪些通信方式,不过由于之前没深入思考且整理过,说的并不好.想必大家也都知道进程有哪些通信方式,可是我猜很多人都是靠着"背"来记忆的,所 ...
- c++ 队列_经典数据结构与算法(一):Python/C/C ++实现堆栈和队列
一.堆栈 堆栈是编程中有用的数据结构.就像一堆盘子彼此叠放. 堆栈表示类似于一堆盘子 想一想用这样一堆盘子可以做的事情 在上面放一个新盘子 卸下顶部盘子 持续来回做实验就知道了堆栈的意义 如果要 ...
- jQuery 一次定时器_记一次腾讯微信面试
2017年7月毕业至今,已经快两年了,这两年的的技术积累得到到底怎样呢?个人觉得,面试是检验技术的唯一标准.所以,决定准备一份简历,到顶尖的互联网公司试一下,广州这边,最好的公司,当然就是微信啦.正好 ...
- 记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背
有一次面试的时候,被问到进程之间有哪些通信方式,不过由于之前没深入思考且整理过,说的并不好.想必大家也都知道进程有哪些通信方式,可是我猜很多人都是靠着"背"来记忆的,所以今天的这篇 ...
- mongodb java 日志分析_记一次log4j与mongodb集成引发的问题分析
问题背景 对项目中的关键应用调用链日志需要结构化得统一吐出到mongodb中,同时项目中日志输出使用log4j,故准备使用log4j的Appender直接集成mongodb的输出,同时mongodb采 ...
- java mysql死锁_记一次线上mysql死锁分析(一)
记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...
- java环境搭建_记一次阿里云服务器Java相关环境搭建的过程
Java在Web开发中有着不可或缺的地位,在我们通常开发中,为了使编写的demo或者项目能够让更多的朋友看到,我们通常会将项目打包发布到网络中的服务器上,以便让更多的人访问到我们的劳动成果上.想着我们 ...
- java 类大写_记java实体类属性名为全部为大写踩的坑(基础)
1.今天后台使用实体类接收参数,然后有个参数发现明明前后都是对应的,但是那个属性偏偏的不到数据 后面百度才知道(写前端太久java基础都给忘了,该补补了) spring默认的命名方式为,首字母转小写, ...
- java没错泄露_记一次尴尬的Java应用内存泄露排查
这星期被线上JVM内存占用不断增大的问题所困扰,自己提出了一些假设,然后去实施验证都一一失败了,有一些经验和教训在这里分享下. 之所以是尴尬,是最后因为修复了另一个看似不相关的问题导致内存不再上升,但 ...
最新文章
- js中substr,substring,indexOf,lastIndexOf的用法
- 视频流中的DTS、PTS到底是什么
- 3Animation动画的创建,CCSpeed,CCFollow
- phpcms v9 配置sphinx全文索引教程
- gitlab增加日志
- [html] 如何解决input在Firefox和Chrome中高度不一致的问题?
- perl6 HTTP::UserAgent (2)
- kafka 事务_Kafka的有且仅有一次语义与事务消息
- 数学建模-Logistic模型
- python 人体建模_Matplotlib学习---可视化人体姿态
- date_sub函数
- 学会3招缓解家务病 身体才能更健康
- 利用mammoth.js将doc文档转为html
- python七巧板三角形_canvas基础入门(二)绘制线条、三角形、七巧板
- 在Linux下掌握arm和操作系统(1)--stm32和arm
- RS485接口电路设计
- 苹果官网镜像下载地址大全(含原版、引导版、ISO/CDR)
- MPI并行计算学习笔记6——行主元高斯消去法
- 【C语言】杨辉三角常用且简单的两种解法(超详细解说)
- 【MySQL】——mysql exporter源码分析
热门文章
- GPU上的快速光谱图分区
- 基于区域的CNN(R-CNN)
- 特斯拉Tesla Model 3整体架构解析(上)
- 2021年大数据Flink(二十一):​​​​​​​案例三 会话窗口
- Android setMovementMethod() 方法
- Static interface methods are only supported starting with Android N (--min-api 24): void okhttp3.log
- github自己的仓库给别人上传代码的操作
- Error:This Gradle plugin requires Studio 3.0 minimum
- python编程小提示
- 洛谷 1774 最接近神的人