队列的最大值(剑指offer59-II)

简介: 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1

一、题目描述



请定义一个队列并实现函数 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]



示例 2:

输入:

["MaxQueue","pop_front","max_value"]

[[],[],[]]

输出: [null,-1,-1]


限制:


1 <= push_back,pop_front,max_value的总操作数 <= 10000

1 <= value <= 10^5


二、思路讲解



这其实容易想到:包含min函数的栈(剑指offer 30)_玉面大蛟龙的博客-CSDN博客


根据这个思路,可以想到用一个队列new_queue,他的队头元素永远是queue中的最大值。 但是两个题有一定的区别,区别主要是源于栈和队列的本质区别。假如我们将队头最大值出队列之后,就无法判断次最大值了。


所以我们需要用一个单调递减的队列,保证这个队列中的值从头到尾是递减的。那么队头元素即是最大值,他出队列之后,此时队头元素是次最大值。


那么如何维护这个单调递减队列呢?


一、当我们入队列时:


1、如果单调队列为空,直接入队列;

2、如果入队列的元素大于队头元素,说明他大于队列中所有元素,就将它放到头部;

3、如果入队列元素小于队头元素,那就从队尾开始,将小于它的元素依次出队尾,再把该元素入队尾。


二、当我们出队列时:


1、如果队列中要出的元素和单调队列中的队头元素相等,说明要出最大的元素,那么将单调队列队头元素出列;

2、如果队列中要出的元素小于单调队列中的队头元素,说明要出的元素不是最大值,就不需要改变单调队列,此时单调队列队头元素仍是最大值。


三、当我们要看最大值时:


直接看单调队列的队头即可。


综上所述,能够完成这个单调队列功能的必须是一个双端队列,所以,我们使用双端队列完成这个单调队列。


三、Java代码实现



class MaxQueue {
    Queue<Integer> queue;   //题目要求定义的队列
    Deque<Integer> deque;   //单调双端队列
    public MaxQueue() {
        queue = new LinkedList<>();
        deque = new LinkedList<>();
    }
    public int max_value() {
        if(queue.size() == 0){
            return -1;
        }
        //直接看单调队列的队头
        return deque.peekFirst();
    }
    public void push_back(int value) {
        queue.add(value);
        //把小于value的元素依次从队尾出队列,保证递减
        while(deque.size()!=0 && deque.peekLast()<=value){
            deque.pollLast();
        }
        deque.add(value);       
    }
    public int pop_front() {
        if(queue.size() == 0){
            return -1;
        }
        int temp = queue.poll();
        //如果要出的是最大值,就把单调队列的头出队列;否则不用管
        if(temp == deque.peekFirst()){
            deque.pollFirst();
        }
        return temp;
    }
}
/**
 * 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();
 */


四、时空复杂度分析



时间复杂度:        O(1)

空间复杂度:        O(N)

相关文章
|
12天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
11438 122
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
2天前
|
人工智能 JSON 监控
Claude Code 源码泄露:一份价值亿元的 AI 工程公开课
我以为顶级 AI 产品的护城河是模型。读完这 51.2 万行泄露的源码,我发现自己错了。
3359 8
|
1天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
1314 2
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
12天前
|
人工智能 IDE API
2026年国内 Codex 安装教程和使用教程:GPT-5.4 完整指南
Codex已进化为AI编程智能体,不仅能补全代码,更能理解项目、自动重构、执行任务。本文详解国内安装、GPT-5.4接入、cc-switch中转配置及实战开发流程,助你从零掌握“描述需求→AI实现”的新一代工程范式。(239字)
7408 139
|
2天前
|
云安全 供应链 安全
Axios投毒事件:阿里云安全复盘分析与关键防护建议
阿里云云安全中心和云防火墙第一时间响应
1141 0
|
3天前
|
人工智能 自然语言处理 数据挖掘
零基础30分钟搞定 Claude Code,这一步90%的人直接跳过了
本文直击Claude Code使用痛点,提供零基础30分钟上手指南:强调必须配置“工作上下文”(about-me.md+anti-ai-style.md)、采用Cowork/Code模式、建立标准文件结构、用提问式提示词驱动AI理解→规划→执行。附可复制模板与真实项目启动法,助你将Claude从聊天工具升级为高效执行系统。
|
2天前
|
人工智能 定位技术
Claude Code源码泄露:8大隐藏功能曝光
2026年3月,Anthropic因配置失误致Claude Code超51万行源码泄露,意外促成“被动开源”。代码中藏有8大未发布功能,揭示其向“超级智能体”演进的完整蓝图,引发AI编程领域震动。(239字)
2128 9
|
10天前
|
人工智能 并行计算 Linux
本地私有化AI助手搭建指南:Ollama+Qwen3.5-27B+OpenClaw阿里云/本地部署流程
本文提供的全流程方案,从Ollama安装、Qwen3.5-27B部署,到OpenClaw全平台安装与模型对接,再到RTX 4090专属优化,覆盖了搭建过程的每一个关键环节,所有代码命令可直接复制执行。使用过程中,建议优先使用本地模型保障隐私,按需切换云端模型补充功能,同时注重显卡温度与显存占用监控,确保系统稳定运行。
2535 9