剑指offer之队列的最大值
题目描述:
请定义一个队列并实现函数 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之队列的最大值相关推荐
- java queue 最大值_[剑指offer题解]队列的最大值/滑动窗口的最大值
前言 众所周知,<剑指offer>是一本"好书". 为什么这么说? 因为在技术面试中,它里面罗列的算法题在面试中出现的频率是非常非常高的. 有多高,以我目前不多的面试来 ...
- 剑指offer:滑动窗口最大值
文章目录 暴力做法 单调队列 题目来源 暴力做法 直接遍历所有的滑动窗口,分别判断最大值. 时间复杂度O(n * k) 空间复杂度O(n) class Solution {public:// 时间复杂 ...
- 剑指offer之礼物的最大值
题目描述: 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘 ...
- 【LeetCode】剑指 Offer 59 - II. 队列的最大值
[LeetCode]剑指 Offer 59 - II. 队列的最大值 文章目录 [LeetCode]剑指 Offer 59 - II. 队列的最大值 package offer;import java ...
- 【LeetCode】【队列】剑指 Offer 59 - I. 滑动窗口的最大值 思路解析和代码
剑指 Offer 59 - I. 滑动窗口的最大值 题目链接 个人思路 题意 思路 滑动窗口的原理符合队列先进先出的性质,因此要考虑使用队列 关键要考虑一个问题 如果pop出当前最大值,要如何再次寻找 ...
- [剑指offer]面试题第[59-2]题[JAVA][队列的最大值][暴力][双端队列]
[问题描述][中等] [解答思路] 1. 暴力 复杂度分析 class MaxQueue {Queue<Integer> queue = new LinkedList();int maxV ...
- java 滑动窗口_【Java】 剑指offer(59-1) 滑动窗口的最大值
本文参考自<剑指offer>一书,代码采用Java语言. 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1 ...
- 【重点】剑指offer——面试题65:滑动窗口的最大值
剑指offer--面试题65:滑动窗口的最大值 Solution1: 笨蛋方法啊.. class Solution { public:vector<int> maxInWindows(co ...
- 《LeetCode力扣练习》剑指 Offer 09. 用两个栈实现队列 Java
<LeetCode力扣练习>剑指 Offer 09. 用两个栈实现队列 Java 一.资源 题目: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 de ...
最新文章
- GitHub标星2000+,如何用30天啃完TensorFlow2.0?
- html滑动直播,HTML5 canvas实现的静态循环滚动播放弹幕
- tensorflow 学习:用CNN进行图像分类
- 计算机病毒的防范(一)计算机病毒的分类
- Android应用程序创建桌面快捷方式
- 【OpenCV】OpenCV函数精讲之 -- Mat和IplImage之间的相互装换(OpenCV2.0和OpenCV3.0)
- Mongotemplate mongodb的各种操作 模糊查询 精确查询
- python人脸识别门禁系统毕设_人脸识别门禁系统 毕业设计 可移植树莓派
- 【leetcode】931. Minimum Falling Path Sum
- DesignPattern_Java:设计模式分类和设计原则
- linux内核手写板驱动,【Linux系统编程应用】 Linux Input子系统(一)
- 『 再看.NET7』看看required属性有什么不同
- UITextView 首行缩进
- 实例学习Ansible系列:配置文件ansible.cfg的设定与使用
- iOS开发者问题答疑——买号、关联、刷评论
- 【威胁通告】攻击者利用漏洞攻击Edimax WiFi桥接器
- 特斯拉专利下载_特斯拉(Tesla)发布专利,Docker达到1.0,等等
- 喜马拉雅三战IPO: “声“意难做、4年累亏近30亿
- SolarWinds入侵事件余波:英特尔、英伟达、思科等科技巨头亦躺枪
- DataGrip初体验
热门文章
- mysql事务所_mysql事务
- UE4 Fix – “Lighting build failed. Swarm failed to kick off.”
- 基于 Android NDK 的学习之旅-----环境搭建
- cesium 隐藏entity_cesium entity创建各类实体
- 神经网络与深度学习——TensorFlow2.0实战(笔记)(六)(Matplotlib绘图基础<折线图和柱状图>python)
- 陀螺仪、罗经、IMU、MEMS四者的区别
- C#多线程编程系列(三)- 线程同步
- TFS中的工作项(六)
- linux virt java_Linux下Java环境安装
- 【JS 逆向百例】网洛者反爬练习平台第二题:JJEncode 加密