请定义一个队列并实现函数 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. LeakCanary检测内存泄漏

    内存泄漏原因: 线程造成的内存泄漏 Handler造成的内存泄漏 单例导致内存泄露 静态变量导致内存泄露 非静态内部类导致内存泄露 未取消注册(BroadcastReceiver )或回调导致内存泄露 ...

  2. CTF-pwn:老板,来几道简单pwn

    wdb_2018_3rd_soEasy 保护全关 在栈上写入shellcode,然后ret2shellcode from pwn import * local = 0pa binary = " ...

  3. rsync 守护进程模式搭建 与常见报错

    守护进程模式搭建 1.环境准备 2.安装rsync(做备份的服务器都安装) [root@backup ~]# yum install -y rsync 3.服务端配置 [root@backup ~]# ...

  4. C. Vladik and Memorable Trip 解析(思維、DP)

    Codeforce 811 C. Vladik and Memorable Trip 解析(思維.DP) 今天我們來看看CF811C 題目連結 題目 給你一個數列,一個區段的數列的值是區段內所有相異數 ...

  5. router-view组件在app.vue中渲染不出来怎么办

    1.在app.vue使用router-view组件直接渲染 页面什么都没显示,可能问题出在路由配置上了,检查路由是否配置完好,路由挂载那里必须使用routes属性 2.在app.vue中router- ...

  6. spring强行注入和引用的例子

    前提: public class DataProviderManagerImpl implements ApplicationContextAware @Override public void se ...

  7. Longest common subsequence(LCS)

    问题 说明该问题在生物学中的实际意义 Biological applications often need to compare the DNA of two (or more) different ...

  8. STM32入门系列-STM32时钟系统,自定义系统时钟

    在时钟树的讲解中我们知道,通过修改PLLMUL中的倍系数值(2-16)可以改变系统的时钟频率.在库函数中也有对时钟倍频因子配置的函数,如下: void RCC_PLLConfig(uint32_t R ...

  9. yython爬虫基础知识入门

    Python爬虫 关注公众号"轻松学编程"了解更多. 大纲: 1.获取响应 urllib(python3)/urllib2-urllib(python2) requests(url ...

  10. linux 查看和设置主机名

    1.设置主机名 通过编辑/etc/sysconfig/network文件中的HOSTNAME字段就可以修改主机名.如下所示: [root@zijuan /]# vim /etc/sysconfig/n ...