前记

面试官问:你了解队列和链表的区别吗?

我:了解,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 头尾 队列_记一次腾讯面试,我挂在了最熟悉不过的队列上相关推荐

  1. html 如何实现一条竖线边上有 刻度_记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背||CSDN博文精选...

    作者:帅地 有一次面试的时候,被问到进程之间有哪些通信方式,不过由于之前没深入思考且整理过,说的并不好.想必大家也都知道进程有哪些通信方式,可是我猜很多人都是靠着"背"来记忆的,所 ...

  2. c++ 队列_经典数据结构与算法(一):Python/C/C ++实现堆栈和队列

     一.堆栈   堆栈是编程中有用的数据结构.就像一堆盘子彼此叠放. 堆栈表示类似于一堆盘子 想一想用这样一堆盘子可以做的事情 在上面放一个新盘子 卸下顶部盘子 持续来回做实验就知道了堆栈的意义 如果要 ...

  3. jQuery 一次定时器_记一次腾讯微信面试

    2017年7月毕业至今,已经快两年了,这两年的的技术积累得到到底怎样呢?个人觉得,面试是检验技术的唯一标准.所以,决定准备一份简历,到顶尖的互联网公司试一下,广州这边,最好的公司,当然就是微信啦.正好 ...

  4. 记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背

    有一次面试的时候,被问到进程之间有哪些通信方式,不过由于之前没深入思考且整理过,说的并不好.想必大家也都知道进程有哪些通信方式,可是我猜很多人都是靠着"背"来记忆的,所以今天的这篇 ...

  5. mongodb java 日志分析_记一次log4j与mongodb集成引发的问题分析

    问题背景 对项目中的关键应用调用链日志需要结构化得统一吐出到mongodb中,同时项目中日志输出使用log4j,故准备使用log4j的Appender直接集成mongodb的输出,同时mongodb采 ...

  6. java mysql死锁_记一次线上mysql死锁分析(一)

    记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...

  7. java环境搭建_记一次阿里云服务器Java相关环境搭建的过程

    Java在Web开发中有着不可或缺的地位,在我们通常开发中,为了使编写的demo或者项目能够让更多的朋友看到,我们通常会将项目打包发布到网络中的服务器上,以便让更多的人访问到我们的劳动成果上.想着我们 ...

  8. java 类大写_记java实体类属性名为全部为大写踩的坑(基础)

    1.今天后台使用实体类接收参数,然后有个参数发现明明前后都是对应的,但是那个属性偏偏的不到数据 后面百度才知道(写前端太久java基础都给忘了,该补补了) spring默认的命名方式为,首字母转小写, ...

  9. java没错泄露_记一次尴尬的Java应用内存泄露排查

    这星期被线上JVM内存占用不断增大的问题所困扰,自己提出了一些假设,然后去实施验证都一一失败了,有一些经验和教训在这里分享下. 之所以是尴尬,是最后因为修复了另一个看似不相关的问题导致内存不再上升,但 ...

最新文章

  1. js中substr,substring,indexOf,lastIndexOf的用法
  2. 视频流中的DTS、PTS到底是什么
  3. 3Animation动画的创建,CCSpeed,CCFollow
  4. phpcms v9 配置sphinx全文索引教程
  5. gitlab增加日志
  6. [html] 如何解决input在Firefox和Chrome中高度不一致的问题?
  7. perl6 HTTP::UserAgent (2)
  8. kafka 事务_Kafka的有且仅有一次语义与事务消息
  9. 数学建模-Logistic模型
  10. python 人体建模_Matplotlib学习---可视化人体姿态
  11. date_sub函数
  12. 学会3招缓解家务病 身体才能更健康
  13. 利用mammoth.js将doc文档转为html
  14. python七巧板三角形_canvas基础入门(二)绘制线条、三角形、七巧板
  15. 在Linux下掌握arm和操作系统(1)--stm32和arm
  16. RS485接口电路设计
  17. 苹果官网镜像下载地址大全(含原版、引导版、ISO/CDR)
  18. MPI并行计算学习笔记6——行主元高斯消去法
  19. 【C语言】杨辉三角常用且简单的两种解法(超详细解说)
  20. 【MySQL】——mysql exporter源码分析

热门文章

  1. GPU上的快速光谱图分区
  2. 基于区域的CNN(R-CNN)
  3. 特斯拉Tesla Model 3整体架构解析(上)
  4. 2021年大数据Flink(二十一):​​​​​​​案例三 会话窗口
  5. Android setMovementMethod() 方法
  6. Static interface methods are only supported starting with Android N (--min-api 24): void okhttp3.log
  7. github自己的仓库给别人上传代码的操作
  8. Error:This Gradle plugin requires Studio 3.0 minimum
  9. python编程小提示
  10. 洛谷 1774 最接近神的人