【Java】 剑指offer(59-2) 队列的最大值
本文参考自《剑指offer》一书,代码采用Java语言。
题目
请定义一个队列并实现函数max得到队列里的最大值,要求函数max、push_back和pop_front的时间复杂度都是O(1)。
思路
与滑动窗口的最大值一题相似,利用一个双端队列来存储当前队列里的最大值以及之后可能的最大值。
在定义题目要求功能的队列时,除了定义一个队列data存储数值,还需额外用一个队列maxmium存储可能的最大值;此外,还要定义一个数据结构,用于存放数据以及当前的index值,用于删除操作时确定是否删除maxmium中最大值。
具体实现见代码,代码进行了一些测试,应该没有什么问题。
测试算例
尾部插入不同大小数字,删除头部数字。插入删除同时获取最大值。
Java代码
import java.util.ArrayDeque; //题目:请定义一个队列并实现函数max得到队列里的最大值,要求函数max、
//push_back和pop_front的时间复杂度都是O(1)。 public class QueueWithMax {
private ArrayDeque<InternalData> data = new ArrayDeque<InternalData>();
private ArrayDeque<InternalData> maximum = new ArrayDeque<InternalData>();
private class InternalData{
int number;
int index;
public InternalData(int number,int index) {
this.number=number;
this.index=index;
}
}
private int curIndex; public void push_back(int number) {
InternalData curData = new InternalData(number,curIndex);
data.addLast(curData); while(!maximum.isEmpty() && maximum.getLast().number<number)
maximum.removeLast();
maximum.addLast(curData); curIndex++; //别漏了这句
} public void pop_front() {
if(data.isEmpty()) {
System.out.println("队列为空,无法删除!");
return;
}
InternalData curData = data.removeFirst();
if(curData.index==maximum.getFirst().index)
maximum.removeFirst();
} public int max() {
if(maximum==null){
System.out.println("队列为空,无法删除!");
return 0;
}
return maximum.getFirst().number;
} public static void main(String[] args) {
QueueWithMax testQueue = new QueueWithMax();
// {2}
testQueue.push_back(2);
System.out.println(testQueue.max()==2);
// {2, 3}
testQueue.push_back(3);
System.out.println(testQueue.max()==3);
// {2, 3, 4}
testQueue.push_back(4);
System.out.println(testQueue.max()==4);
// {2, 3, 4, 2}
testQueue.push_back(2);
System.out.println(testQueue.max()==4);
// {3, 4, 2}
testQueue.pop_front();
System.out.println(testQueue.max()==4);
// {4, 2}
testQueue.pop_front();
System.out.println(testQueue.max()==4);
// {2}
testQueue.pop_front();
System.out.println(testQueue.max()==2);
// {2, 6}
testQueue.push_back(6);
System.out.println(testQueue.max()==6);
// {2, 6, 2}
testQueue.push_back(2);
System.out.println(testQueue.max()==6);
// {2, 6, 2, 5}
testQueue.push_back(5);
System.out.println(testQueue.max()==6);
// {6, 2, 5}
testQueue.pop_front();
System.out.println(testQueue.max()==6);
// {2, 5}
testQueue.pop_front();
System.out.println(testQueue.max()==5);
// {5}
testQueue.pop_front();
System.out.println(testQueue.max()==5);
// {5, 1}
testQueue.push_back(1);
System.out.println(testQueue.max()==5);
}
}
true
true
true
true
true
true
true
true
true
true
true
true
true
true
QueueWithMax
收获
1.在定义private ArrayDeque<InternalData> data时,别忘记了new ArrayDeque<InternalData>();否则在插入数据时,会抛出NPE异常。
2.进行删除操作时,注意是否队列是否为空。
【Java】 剑指offer(59-2) 队列的最大值的更多相关文章
- 剑指 Offer 59 - II. 队列的最大值--滑动窗口的建模+Deque的基本使用(常用方法)
剑指 Offer 59 - II. 队列的最大值 题目链接 package com.walegarrett; /** * @Author WaleGarrett * @Date 2020/12/3 1 ...
- 剑指 Offer 59 - I. 滑动窗口的最大值 + 双指针 + 双端队列
剑指 Offer 59 - I. 滑动窗口的最大值 Offer_59_1 题目详情 方法一:暴力方法+双指针 package com.walegarrett.offer; /** * @Author ...
- 力扣 - 剑指 Offer 59 - I. 滑动窗口的最大值
题目 剑指 Offer 59 - I. 滑动窗口的最大值 思路1(单调队列) 使用单调(递减)队列,保持队列中的元素是递减顺序,队列头保存的是当前窗口中最大的元素 首先先模拟建立第一个窗口,同时获取第 ...
- 【Java】 剑指offer(59-1) 滑动窗口的最大值
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例 ...
- 【剑指Offer】滑动窗口的最大值 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 暴力求解 单调递减队列 日期 题目地址:https://www ...
- Go语言实现:【剑指offer】滑动窗口的最大值
该题目来源于牛客网<剑指offer>专题. 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存 ...
- 剑指offer:滑动窗口的最大值(栈和队列)
1. 题目描述 /* 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值. 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别 ...
- 剑指Offer 59. 按之字形顺序打印二叉树 (二叉树)
题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题目地址 https://www.nowco ...
- [剑指Offer] 59.按之字形顺序打印二叉树
题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. [思路]先按层次遍历存入,通过设立标志位,将 ...
- 剑指offer——59二叉搜索树的第k大节点
题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. 题解: 考察的就是中序遍历 不过注意进行剪枝 cl ...
随机推荐
- HNOI2018游记
第一次参加本省省选,结果又是一次划水 Day 0 喝了一个小时鸡汤 大家看看人家钱学森(sheng) 竞赛生要多发展些爱好 不要一考完就fake,那种下考说"大佬AC辣!太强啦!月莫月莫月莫 ...
- SpringBoot启动方式讲解和部署war项目到tomcat9
1.SpringBoot启动方式讲解和部署war项目到tomcat9简介:SpringBoot常见启动方式讲解和部署war项目Tomcat 1.ide启动 2.jar包方式启动 maven插件: &l ...
- 【PE结构】PIMAGE_FILE_HEADER中TimeDateStamp的时间戳与标准时间转换
计算PE文件创建时间,需要对时间进行转换,也就是将时间戳转换成特定的格式,或者特定的格式转换成时间戳. pImageFileHeader->TimeDateStamp的值为1487665851 ...
- CC254x/CC2540/CC2541库函数速查(转)
hci.h 转自:http://blog.csdn.net/xiaoleiacmer/article/details/44036607#t1 //分配内存,应用程序不应该调用这个函数. void *H ...
- openssl版本升级操作记录【转】
需要部署nginx的https环境,之前是yum安装的openssl,版本比较低,如下: [root@nginx ~]# yum install -y pcre pcre-devel openss ...
- eclipse配置JDK
配置JDK 注意:此处配置的是JDK安装路径,不是JRE!!!
- Linux关闭防火墙,开放端口
Centos/redhat系统: 开启防火墙 #systemctl start firewalld.service 停止firewall #systemctl stop firewalld.servi ...
- ubuntu 14.04 上配置vlc组播源
VLC: Video LAN多媒体播放器,是一个跨平台开源的软件,支持主流的编码格式MPEG-2.H.264等. (1)ubuntu上安装vlc: sudo apt-get install vlc ...
- OCM_第十天课程:Section5—》数据仓库
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- java 数据的存储
1. 寄存器. 这是最快的存储区,因为它位于不同于其他存储区的地方 -- 处理器的内部.但是寄存器的数量极其有限,所以寄存器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象. ...