题目描述:

请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1
示例 1:
输入:
[“MaxQueue”,“push_back”,“push_back”,“max_value”,“pop_front”,“max_value”]
[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2]

主要思想:
利用两个队列(一个单端队列q,一个双端队列d)。q用来存储队列中的值,d用来存储队列的最大值。
对于max_value()函数,当队列非空时,返回d的队首元素,否则返回-1。
这道题的关键在于最大值得存储。此处利用双端队列的优势,每次向队列中插入数据时,与d的队尾元素相比较,如果比队尾元素大,那么将队尾元素弹出队列,继续循环,最终维持双端队列d中的元素单调递减。
对于队列的弹出操作,如果q的首元素并非当前元素的最大值,直接弹出队列的值就可以了,如果为最大值时,要同时对两个队列执行弹出操作。

class MaxQueue {queue<int> q;
deque<int> d;
public:MaxQueue() {}   int max_value() {if (d.empty())return -1;return d.front();}void push_back(int value) {while (!d.empty() && d.back() < value) {d.pop_back();}d.push_back(value);q.push(value);}int pop_front() {if (q.empty())return -1;int ans = q.front();if (ans == d.front()) {d.pop_front();}q.pop();return ans;}
};

注意:上述代码并非原创,如原作者看到,可联系删除。

剑指offer之队列的最大值相关推荐

  1. java queue 最大值_[剑指offer题解]队列的最大值/滑动窗口的最大值

    前言 众所周知,<剑指offer>是一本"好书". 为什么这么说? 因为在技术面试中,它里面罗列的算法题在面试中出现的频率是非常非常高的. 有多高,以我目前不多的面试来 ...

  2. 剑指offer:滑动窗口最大值

    文章目录 暴力做法 单调队列 题目来源 暴力做法 直接遍历所有的滑动窗口,分别判断最大值. 时间复杂度O(n * k) 空间复杂度O(n) class Solution {public:// 时间复杂 ...

  3. 剑指offer之礼物的最大值

    题目描述: 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘 ...

  4. 【LeetCode】剑指 Offer 59 - II. 队列的最大值

    [LeetCode]剑指 Offer 59 - II. 队列的最大值 文章目录 [LeetCode]剑指 Offer 59 - II. 队列的最大值 package offer;import java ...

  5. 【LeetCode】【队列】剑指 Offer 59 - I. 滑动窗口的最大值 思路解析和代码

    剑指 Offer 59 - I. 滑动窗口的最大值 题目链接 个人思路 题意 思路 滑动窗口的原理符合队列先进先出的性质,因此要考虑使用队列 关键要考虑一个问题 如果pop出当前最大值,要如何再次寻找 ...

  6. [剑指offer]面试题第[59-2]题[JAVA][队列的最大值][暴力][双端队列]

    [问题描述][中等] [解答思路] 1. 暴力 复杂度分析 class MaxQueue {Queue<Integer> queue = new LinkedList();int maxV ...

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

    本文参考自<剑指offer>一书,代码采用Java语言. 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1 ...

  8. 【重点】剑指offer——面试题65:滑动窗口的最大值

    剑指offer--面试题65:滑动窗口的最大值 Solution1: 笨蛋方法啊.. class Solution { public:vector<int> maxInWindows(co ...

  9. 《LeetCode力扣练习》剑指 Offer 09. 用两个栈实现队列 Java

    <LeetCode力扣练习>剑指 Offer 09. 用两个栈实现队列 Java 一.资源 题目: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 de ...

最新文章

  1. GitHub标星2000+,如何用30天啃完TensorFlow2.0?
  2. html滑动直播,HTML5 canvas实现的静态循环滚动播放弹幕
  3. tensorflow 学习:用CNN进行图像分类
  4. 计算机病毒的防范(一)计算机病毒的分类
  5. Android应用程序创建桌面快捷方式
  6. 【OpenCV】OpenCV函数精讲之 -- Mat和IplImage之间的相互装换(OpenCV2.0和OpenCV3.0)
  7. Mongotemplate mongodb的各种操作 模糊查询 精确查询
  8. python人脸识别门禁系统毕设_人脸识别门禁系统 毕业设计 可移植树莓派
  9. 【leetcode】931. Minimum Falling Path Sum
  10. DesignPattern_Java:设计模式分类和设计原则
  11. linux内核手写板驱动,【Linux系统编程应用】 Linux Input子系统(一)
  12. 『 再看.NET7』看看required属性有什么不同
  13. UITextView 首行缩进
  14. 实例学习Ansible系列:配置文件ansible.cfg的设定与使用
  15. iOS开发者问题答疑——买号、关联、刷评论
  16. 【威胁通告】攻击者利用漏洞攻击Edimax WiFi桥接器
  17. 特斯拉专利下载_特斯拉(Tesla)发布专利,Docker达到1.0,等等
  18. 喜马拉雅三战IPO: “声“意难做、4年累亏近30亿
  19. SolarWinds入侵事件余波:英特尔、英伟达、思科等科技巨头亦躺枪
  20. DataGrip初体验

热门文章

  1. mysql事务所_mysql事务
  2. UE4 Fix – “Lighting build failed. Swarm failed to kick off.”
  3. 基于 Android NDK 的学习之旅-----环境搭建
  4. cesium 隐藏entity_cesium entity创建各类实体
  5. 神经网络与深度学习——TensorFlow2.0实战(笔记)(六)(Matplotlib绘图基础<折线图和柱状图>python)
  6. 陀螺仪、罗经、IMU、MEMS四者的区别
  7. C#多线程编程系列(三)- 线程同步
  8. TFS中的工作项(六)
  9. linux virt java_Linux下Java环境安装
  10. 【JS 逆向百例】网洛者反爬练习平台第二题:JJEncode 加密