面试题59 - II. 队列的最大值
请定义一个队列并实现函数 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();
*/
- 使用两个队列来实现,原理是入队时一个正常出入队,一个是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. 队列的最大值的更多相关文章
- 《剑指offer》面试题59 - II. 队列的最大值
问题描述 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value.push_back 和 pop_front 的均摊时间复杂度都是O(1). 若队列为空,pop_ ...
- [LeetCode] 面试题59 - II. 队列的最大值
题目: 分析: 本题要求三个方法的时间复杂度都是O(1),对于push_back和pop_front都是好实现的 但是对于max_value,正常情况下要进行遍历才能获得最大值,那么如何才能在O(1) ...
- 剑指offer 面试题65 滑动窗口的最大值
import java.awt.print.Printable; import java.beans.VetoableChangeListenerProxy; import java.lang.ref ...
- 剑指 Offer 59 - II. 队列的最大值--滑动窗口的建模+Deque的基本使用(常用方法)
剑指 Offer 59 - II. 队列的最大值 题目链接 package com.walegarrett; /** * @Author WaleGarrett * @Date 2020/12/3 1 ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- 剑指 Offer 14- II. 剪绳子 II
剑指 Offer 14- II. 剪绳子 II 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]... ...
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指Offer——Java实现栈和队列的互模拟操作
剑指Offer--Java实现栈和队列的互模拟操作 栈模拟队列 题目:JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 思路:其实就是把队列正常入 ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
随机推荐
- 通过Relect反射方法创建对象,获得对象的方法,输出对象信息
package reflects; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java. ...
- 导出excel带合并单元格方法的Demo
package com.test.util; import java.io.FileNotFoundException; import java.io.FileOutputStream; import ...
- 09 Servlet中间服务 连接前段和后端
import 导入 在当前类中使用外包中的类时使用 cookies 缓存 Alt + enter 提示快捷键 Servlet 服务 (连接前段和后端) Servlet本质就是Java类 Ja ...
- 华为云FusionInsight湖仓一体解决方案的前世今生
摘要:华为云发布新一代智能数据湖华为云FusionInsight时再次提到了湖仓一体理念,那我们就来看看湖仓一体的来世今生. 伴随5G.大数据.AI.IoT的飞速发展,数据呈现大规模.多样性的极速增长 ...
- Linux和MySQL的安装与基本操作
- 如何在Windows Server 2012及更高版本中将域控制器降级
如何在Windows Server 2012及更高版本中将域控制器降级 如果不降级就重装系统,会出问题,所以在将域控系统重装系统之前一定要先降级. 使用服务器管理器将 Windows Server 2 ...
- (三)URI、URL和URN/GET与POST的区别
(一)URI.URL.URN HTTP使用统一资源标识符(Uniform Resource Identifiers,URI)来传输数据和建立连接. URL是一种特殊类型的URI,包含了用于查找某个资源 ...
- C语言经典100例-ex001
系列文章<C语言经典100例>持续创作中,欢迎大家的关注和支持. 喜欢的同学记得点赞.转发.收藏哦- 后续C语言经典100例将会以pdf和代码的形式发放到公众号 欢迎关注:计算广告生态 即 ...
- JavaSE基础语法学习
标识符 表示类名的标识符用大写字母开始. 表示方法和变量的标识符用小写字母开始,后面的描述性词以大写开始. 注意 所有的标识符都应该以字母(A-Z 或者 a-z),美元符($).或者下划线(_)开始 ...
- keras中的early stopping
目的:防止过拟合 # early stoppping from keras.callbacks import EarlyStopping early_stopping = EarlyStopping( ...