请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的时间复杂度都是O(1)。

若队列为空,pop_front 和 max_value 需要返回 -1

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这道题可以和之前的那个单调栈放在一起看单调栈

1. 使用大顶堆来实现,传入comparator比较器。比较简单无脑。

class MaxQueue {
private LinkedList<Integer> list;
private PriorityQueue<Integer> max;
private Comparator<Integer> cam=new Comparator<>(){
public int compare(Integer o1,Integer o2)
{
return o2-o1;
}
};
public MaxQueue() {
list=new LinkedList<>();
max=new PriorityQueue<>(cam);
} public int max_value() {
return max.isEmpty()?-1:max.peek();
} public void push_back(int value) {
list.addLast(value);
max.add(value);
} public int pop_front() {
if(list.isEmpty())
return -1;
int front=list.getFirst();
if(!max.isEmpty())
max.remove(front);
return list.remove();
}
} /**
* Your MaxQueue object will be instantiated and called as such:
* MaxQueue obj = new MaxQueue();
* int param_1 = obj.max_value();
* obj.push_back(value);
* int param_3 = obj.pop_front();
*/
  1. 使用两个队列来实现,原理是入队时一个正常出入队,一个是max队,存放最大值信息,这里的关键是对于入队而言,如果入队的这个值要比队列最后一个值要小,那么可以直接入队,不然大的话,就要删去前面比它小的值,容易理解为对于list而言这个位置比之前的几个位置的最大值大的话,那么他就是最大值了,所以max队列的结构是降序排列的,如果出现一个最大的要加入,那么之前所有元素都要去除,如果不是最大,那么也要去除在他之前比他大的元素,知道遇到一个比他要小的。
class MaxQueue {
private LinkedList<Integer> list;
private LinkedList<Integer> max; public MaxQueue() {
list=new LinkedList<>();
max=new LinkedList<>();
} public int max_value() {
if(max.isEmpty())
return -1;
return max.peek();
} public void push_back(int value) {
list.add(value); while(!max.isEmpty()&&max.getLast()<value)
max.pollLast();
max.add(value);
} public int pop_front() {
if(list.isEmpty())
return -1;
int front =list.pollFirst();
if(front==max.peek())
max.remove();
return front;
}
} /**
* Your MaxQueue object will be instantiated and called as such:
* MaxQueue obj = new MaxQueue();
* int param_1 = obj.max_value();
* obj.push_back(value);
* int param_3 = obj.pop_front();
*/

面试题59 - II. 队列的最大值的更多相关文章

  1. 《剑指offer》面试题59 - II. 队列的最大值

    问题描述 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value.push_back 和 pop_front 的均摊时间复杂度都是O(1). 若队列为空,pop_ ...

  2. [LeetCode] 面试题59 - II. 队列的最大值

    题目: 分析: 本题要求三个方法的时间复杂度都是O(1),对于push_back和pop_front都是好实现的 但是对于max_value,正常情况下要进行遍历才能获得最大值,那么如何才能在O(1) ...

  3. 剑指offer 面试题65 滑动窗口的最大值

    import java.awt.print.Printable; import java.beans.VetoableChangeListenerProxy; import java.lang.ref ...

  4. 剑指 Offer 59 - II. 队列的最大值--滑动窗口的建模+Deque的基本使用(常用方法)

    剑指 Offer 59 - II. 队列的最大值 题目链接 package com.walegarrett; /** * @Author WaleGarrett * @Date 2020/12/3 1 ...

  5. C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解

    剑指offer  面试题23:从上往下打印二叉树 参与人数:4853  时间限制:1秒  空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...

  6. 剑指 Offer 14- II. 剪绳子 II

    剑指 Offer 14- II. 剪绳子 II 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]... ...

  7. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  8. 剑指Offer——Java实现栈和队列的互模拟操作

    剑指Offer--Java实现栈和队列的互模拟操作 栈模拟队列   题目:JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型.   思路:其实就是把队列正常入 ...

  9. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

随机推荐

  1. Redis基础(二)数据库

    数据库 Redis服务器的所有数据库都保存在redisServer.db数组中,而数据库的数量则由redisServer.dbnum属性保存. struct redisServer { // .. / ...

  2. (python)getattr等用法

    getattr() 函数用于返回一个对象属性值; 语法 getattr(object, name[, default]) 参数 object -- 对象. name -- 字符串,对象属性. defa ...

  3. C. Bank Hacking 解析(思維)

    Codeforce 796 C. Bank Hacking 解析(思維) 今天我們來看看CF796C 題目連結 題目 略,請直接看原題. 前言 @copyright petjelinux 版權所有 觀 ...

  4. 初识ABP vNext(12):模块的独立运行与托管

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 模块运行 动态 C# API 客户端 最后 前言 很久没更新这个系列...之前的章节中讲到ABP的模块是可以独立运行的 ...

  5. LoRa技术的发展应用和LoRa应用设备

    LoRa技术的发展应用 LORA技术大约在十年前由法国和瑞士开发,到现今LORA技术已经是物联网发展应用中不可缺少的一部分,根据中国物联网研究与发展中心的数据,2025年我国物联网产业规模将达到2万亿 ...

  6. FastCGI协议分析

    不知道什么时候,就开始有了让HomeServer支持PHP的念头.于是分析起了FastCGI协议.FastCGI用于WebServer与WebApplication之间的通讯,例如Apache与PHP ...

  7. Java学习的第四十四天

    1.例5.4将二维数组的行列互换 public class cjava { public static void main(String []args) { int [][]a=new int [][ ...

  8. 做Java开发7年,今年9个月时间圆梦饿了么P7

    前言 工作拧螺丝,面试造火箭.我想这是每个程序员比较头疼的事情吧!但是,又必须要经历一个面试流程,尤其是摸不清面试官问的问题,导致面试的时候不知道如何回答.本文是工作7年Java程序员从几十次面试中挑 ...

  9. 分库分表的 9种分布式主键ID 生成方案,挺全乎的

    <sharding-jdbc 分库分表的 4种分片策略> 中我们介绍了 sharding-jdbc 4种分片策略的使用场景,可以满足基础的分片功能开发,这篇我们来看看分库分表后,应该如何为 ...

  10. (3)ASP.NET Core3.1 Ocelot认证

    1.认证 当客户端通过Ocelot访问下游服务的时候,为了保护下游资源服务器会进行认证鉴权,这时候需要在Ocelot添加认证服务.添加认证服务后,随后使用Ocelot基于声明的任何功能,例如授权或使用 ...