队列的最大值

此博客链接:https://www.cnblogs.com/ping2yingshi/p/12437319.html

队列的最大值

题目链接:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/comments/

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

题解:

         题意:一开始题目都没有读懂,后来看了好多题解也没有说题目啥意思,最后看代码一点一点才明白题意,欣姐也给我找了一个题解才更加明白,题目给的示例中输入:给的示例第一列的函数和第二列的数值是对应的,比如题目给的第一个例子可以理解为以下步骤,这里是欣姐提供给我看的:

MaxQueue” 生成队列

        [] 传入的值为空

        无输出,故输出为null

2、 "push_back" 向队列传入元素

        [1] 传入的值为1

        此时队列中只有一个1

        函数无输出,故输出为null

3、 "push_back" 向队列传入元素

        [2] 传入的值为2

        此时队列为 --进-> [2,1] --出->

        函数无输出,故输出为null

4、 "max_value" 求队列中的最大值

        [] 传入的值为空

        输出为2

5、 "pop_front" 删除队列头部元素

        [] 传入的值为空

        函数pop_front还要输出删除元素的值,故输出为1

思路:我看的官方代码,官方用的暴力破解,直接找一个队列中的最大值,如果进队一个元素,则和最大值做比较,大于最大值,则把进入队列的值赋值给最大值,如果进队的值没有当前的最大值大,则不做任何操作。

代码如下:

 

class MaxQueue {
    LinkedList<Integer> queue;
    int maxValue;
    public MaxQueue() {
        queue = new LinkedList<>();
        maxValue = Integer.MIN_VALUE;
    }
    
    public int max_value() {
        if (queue.isEmpty())
            return -1;
        return maxValue;
    }
    
    public void push_back(int value) {
        queue.addLast(value);
        if (value > maxValue)
            maxValue = value;
    }
    
    public int pop_front() {
        if (queue.isEmpty())
            return -1;
        int firstNum = queue.removeFirst();
        if (firstNum == maxValue)
            getMax();
        return firstNum;
    }

    public void getMax() {
        maxValue = Integer.MIN_VALUE;
        for (int num:queue)
            maxValue = Math.max(maxValue, num);
    }
}

 

posted @ 2020-03-07 21:32  萍2樱释  阅读(308)  评论(1编辑  收藏  举报