本文参考自《剑指offer》一书,代码采用Java语言。

更多:《剑指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.进行删除操作时,注意是否队列是否为空。

更多:《剑指Offer》Java实现合集  

【Java】 剑指offer(59-2) 队列的最大值的更多相关文章

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

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

  2. 剑指 Offer 59 - I. 滑动窗口的最大值 + 双指针 + 双端队列

    剑指 Offer 59 - I. 滑动窗口的最大值 Offer_59_1 题目详情 方法一:暴力方法+双指针 package com.walegarrett.offer; /** * @Author ...

  3. 力扣 - 剑指 Offer 59 - I. 滑动窗口的最大值

    题目 剑指 Offer 59 - I. 滑动窗口的最大值 思路1(单调队列) 使用单调(递减)队列,保持队列中的元素是递减顺序,队列头保存的是当前窗口中最大的元素 首先先模拟建立第一个窗口,同时获取第 ...

  4. 【Java】 剑指offer(59-1) 滑动窗口的最大值

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例 ...

  5. 【剑指Offer】滑动窗口的最大值 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 暴力求解 单调递减队列 日期 题目地址:https://www ...

  6. Go语言实现:【剑指offer】滑动窗口的最大值

    该题目来源于牛客网<剑指offer>专题. 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存 ...

  7. 剑指offer:滑动窗口的最大值(栈和队列)

    1. 题目描述 /* 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值. 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别 ...

  8. 剑指Offer 59. 按之字形顺序打印二叉树 (二叉树)

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题目地址 https://www.nowco ...

  9. [剑指Offer] 59.按之字形顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. [思路]先按层次遍历存入,通过设立标志位,将 ...

  10. 剑指offer——59二叉搜索树的第k大节点

    题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4.   题解: 考察的就是中序遍历 不过注意进行剪枝 cl ...

随机推荐

  1. mysql 案例 ~查询导致的tmp临时文件问题

    一 简介:之前遇到一个tmp分区暴涨的问题,后来经过大神的指点,遂分析写下 二 分类: 1  select语句出现 using temporay tmp 下出现 #sql_631a_1.MYD #sq ...

  2. jquery 学习(三) - 遍历操作

    HTML代码 <p>1111</p> <p>1111</p> <p>1111</p> <p>1111</p&g ...

  3. python - 自定制property/property的延时计算

    自定制prooerty: #模拟@property 实现将类的函数属性变成类属性: #定义描述符 class msf(): def __init__(self,obj): self.obj = obj ...

  4. python 设计及调试的一些小技巧

    在“笨办法学习python”中介绍了一些设计函数以及调试技巧: 参考网址:http://www.jb51.net/shouce/Pythonbbf/latest/ex36.html If 语句的规则¶ ...

  5. Linux用户组相关指令

    ⒈增加用户组 ①groupadd 用户组名 ⒉删除用户组 ①groupdel 用户组名 ⒊修改用户所在的用户组 ①usermod -g 用户组 用户名 ★用户和用户组的相关文件 ①/etc/passw ...

  6. 【转】mysql8.0 在window环境下的部署与配置

    [转]mysql8.0 在window环境下的部署与配置 今天在阿里云window服务器上配置mysql环境,踩了一些坑,分享出来.需要的朋友可以看看.额,或许有人要吐槽我为什么不在linux上去配置 ...

  7. python3 三元表达式,列表解析

    python3 三元表达式,列表解析 三元表达式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 x=2 y=3   if x > y ...

  8. Linux下svn常用指令【转】

    转自:http://blog.csdn.net/myarrow/article/details/8110858 Windows下的TortoiseSVN是资源管理器的一个插件,以覆盖图标表示文件状态, ...

  9. Javascript构造函数的继承

    仅供学习参考,原文链接:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html 今天要介绍 ...

  10. centos7 部署 docker ce

    =============================================== 2019/4/9_第1次修改                       ccb_warlock === ...