请定义一个队列并实现函数 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. MAP;MLE

    判别学习算法:直接对问题进行求解,比如二分类问题,都是在空间中寻找一条直线从而把类别的样例分开,对于新的样例只要判断在直线的那一侧就可. ==>这种直接求解的方法称为判别学习方法 生成学习算法: ...

  2. viewpage启动页

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com ...

  3. 字符串截取 slice,substr,substring 的区别

    一 只传递一个参数时候 let str = '0123456'; str.slice(5); //'56' str.substr(5); // '56' str.substring(5); // '5 ...

  4. 嵌入式以太网模块的TCP Client模式说明

    嵌入式以太网模块采用TTL电平串口,支持TCP Server,TCP Client,UDP Slave,UDP Master,TCP-ZSD,UDP-ZSD多种通信协议,TCP服务器模式支持多连接,可 ...

  5. 838. Push Dominoes —— weekly contest 85

    Push Dominoes There are N dominoes in a line, and we place each domino vertically upright. In the be ...

  6. ATcoder Grand Contest总结

    最前面: AT的题都很有思维难度,总结一下一些AT的常规操作 1.对于有操作的题目,如果正面推不行的话考虑倒推,将操作转化,寻找更好的性质 2.模型转化,看到某一种的计算的式子,需要考虑有没有更简化的 ...

  7. 直播带货APP源码开发为什么选择云服务器

    云服务器可以为直播带货APP源码提供弹性计算以及更高的运行效率,避免资源浪费,随着直播带货APP源码业务需求的变化,可以实时扩展或缩减计算资源.CVM支持按实际使用的资源计费,可以节约计算成本. 一. ...

  8. 为什么要谨慎使用Arrays.asList、ArrayList的subList?

    1. 使用Arrays.asList的注意事项 1.1 可能会踩的坑 先来看下Arrays.asList的使用: List<Integer> statusList = Arrays.asL ...

  9. JavaSE基础语法学习-异常

    异常 异常指程序运行中出现的不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等. 异常发生在程序运行期间,它影响了正常的程序执行流程. 比如说,你的代码少了一个分号,那么运行出来结果是提示是 ...

  10. leetcode68-search-in-rotated-sorted-array-ii

    题目描述 继续思考题目 "Search in Rotated Sorted Array": 如果数组种允许有重复元素怎么办? 会影响时间复杂度吗?是怎样影响时间复杂度的,为什么? ...