[LeetCode] 面试题59 - II. 队列的最大值

题目:


分析:

本题要求三个方法的时间复杂度都是O(1),对于push_back和pop_front都是好实现的

但是对于max_value,正常情况下要进行遍历才能获得最大值,那么如何才能在O(1)的时间复杂度下获得最大值?

O(1)时间复杂度意味着直接便可以获得最大值,一开始的想法是设置两个变量,一个最大值max,一个第二大值max_2,每次push_back时进行更新,若pop_front的值与最大值相同,便让max = max_2

但这样有个问题,当连续两次pop_front,同时前两大的数字都被pop出去时,max与max_2存储的值都是错误的,如果要重新确定max与max_2的值,又要进行遍历了

后来看了题解,里面提到维护一个排序队列(双向),当一个元素cur插入时,它前面所有比它小的值都不会对最大值有影响,而比它大的已经出队了,因为正常出队时,出到cur时,它前面的所有值已全部出队,所以插入时更新双向排序队列,只保留比当前值大的值的有序队列,便可以直接取到max_value,同时不必担心连续出队导致的找不大最大值,如果出队的值真好是当前的最大值,只需要将双向队列的队头出队即可

至于为何时间复杂度为O(1), 题解中提到:

我的理解是,在插入时,会将小于当前值的值出队,不过这个出队的操作次数是有限的,一个插入操作最多只有n个出队操作,更多的情况是小于n个操作,也就是说n个插入操作总共进行了n次出队,平均下来就是O(1)的复杂度

代码:

class MaxQueue {
    queue<int> que;
    deque<int> deq;
public:
    MaxQueue() {

    }

    int max_value() {
        if(deq.empty()) return -1;
        return deq.front();

    }

    void push_back(int value) {
        while(!deq.empty() && deq.back()<value)
            deq.pop_back();
        deq.push_back(value);
        que.push(value);
    }

    int pop_front() {
        if(que.empty()) return -1;
        int res = que.front();
        que.pop();
        if(res == deq.front())  deq.pop_front();
        return res;
    }
};

/**
 * 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();
 */

原文地址:https://www.cnblogs.com/ech2o/p/12433647.html

时间: 2024-07-30 09:20:30

[LeetCode] 面试题59 - II. 队列的最大值的相关文章

LeetCode | 面试题59 - II. 队列的最大值【Python】

LeetCode 面试题59 - II. 队列的最大值[Medium][Python][队列] 问题 力扣 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value.push_back 和 pop_front 的均摊时间复杂度都是O(1). 若队列为空,pop_front 和 max_value 需要返回 -1 示例 1: 输入: ["MaxQueue","push_back","push_back",&quo

【LeetCode】面试题59 - II. 队列的最大值

题目链接: 面试题59 - II. 队列的最大值 题目描述: 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数 max_value.push_back 和 pop_front 的时间复杂度都是 O(1). 若队列为空,pop_front 和 max_value 需要返回 -1. 示例: 示例 1: 输入: ["MaxQueue","push_back","push_back","max_value",

【剑指Offer】面试题59 - II. 队列的最大值

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

面试题59 - II.:队列的最大值(C++)

题目地址:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/ 题目描述 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value.push_back 和 pop_front 的均摊时间复杂度都是O(1). 若队列为空,pop_front 和 max_value 需要返回 -1 题目示例 示例 1: 输入: ["MaxQueue","push_back",&quo

剑指OFFER----面试题59 - II. 队列的最大值

链接:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/ 代码 class MaxQueue { public: queue<int> q; deque<int> d; MaxQueue() { } int max_value() { if (d.empty()) return -1; return d.front(); } void push_back(int value) { while (!d.empty(

LeetCode——面试题57 - II. 和为s的连续正数序列

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数). 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列. 示例 1: 输入:target = 9 输出:[[2,3,4],[4,5]] 示例 2: 输入:target = 15 输出:[[1,2,3,4,5],[4,5,6],[7,8]] 限制: 1 <= target <= 10^5 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/he

leetcode面试题59

双端队列 实际上就是一个每次push pop的常规queue和另一个首位是最大值的queue type MaxQueue struct { Queue []int Max []int Size int } func Constructor() MaxQueue { return MaxQueue{ Queue: []int{}, Max: []int{}, Size: 0, } } func (this *MaxQueue) Max_value() int { if this.Size == 0

菜鸟系列 Golang 实战 Leetcode —— 面试题57 - II. 和为s的连续正数序列

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数). 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列. ? 示例 1: 输入:target = 9 输出:[[2,3,4],[4,5]] 示例 2: 输入:target = 15 输出:[[1,2,3,4,5],[4,5,6],[7,8]] ? 限制: 1 <= target <= 10^5 题解1: 采用滑动窗口,设置左右两个指针,如果sum为target,则保存双指针内的值,如果sum&

《剑指offer》第五十九题II:队列的最大值

// 面试题59(二):队列的最大值 // 题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如, // 如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小3,那么一共存在6个 // 滑动窗口,它们的最大值分别为{4, 4, 6, 6, 6, 5}, #include <cstdio> #include <deque> #include <exception> using namespace std; template<