剑指 Offer 59 - II. 队列的最大值
发布日期:2021-05-08 03:55:22 浏览次数:19 分类:精选文章

本文共 1438 字,大约阅读时间需要 4 分钟。

剑指 Offer 59 - II. 队列的最大值

问题描述

定义一个队列并实现函数 max_value,用于获取队列中的最大值。要求 max_valuepush_backpop_front 的均摊时间复杂度均为 O(1)。若队列为空,则 pop_frontmax_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]

约束条件

  • push_backpop_frontmax_value 的总操作数 ≤ 10,000
  • 值范围:1 ≤ value ≤ 10^5
  • 解决方法

    方法一:利用 deque 和 queue

    我们可以通过组合 dequequeue 来实现 O(1) 的均摊时间复杂度。具体实现如下:

    class MaxQueue {
    private:
    queue
    que;
    deque
    deq;
    public:
    MaxQueue() {}
    int max_value() {
    return deq.empty() ? -1 : deq.front();
    }
    void push_back(int value) {
    que.push(value);
    // 保持 deque 的前缀最大
    while (!deq.empty() && deq.back() < value) {
    deq.pop_back();
    }
    deq.push_back(value);
    }
    int pop_front() {
    if (que.empty()) return -1;
    int val = 0;
    if (!deq.empty()) {
    val = deq.front();
    deq.pop_front();
    }
    que.pop();
    return val;
    }
    };

    实例说明

    通过上述实现,push_backpop_frontmax_value 的均摊时间复杂度均为 O(1)。具体实现细节如下:

  • push_back 方法:

    • 将元素添加到 queue
    • 同时,保持 deque 的前缀最大,确保 deque 的前缀始终是最大的,避免重复元素。
  • pop_front 方法:

    • 如果 queue 为空,返回 -1。
    • deque 中取出前缀元素,并从 queue 中取出对应的元素。
  • max_value 方法:

    • 检查 deque 是否为空,若为空返回 -1。
    • 返回 deque 的前缀元素。
  • 这种设计保证了在处理队列时,均摊时间复杂度为 O(1),满足题目的要求。

    上一篇:剑指 Offer 67. 把字符串转换成整数
    下一篇:七:微服务调用组件Feign

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年03月21日 01时50分01秒