此博客链接: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); } }
原文:https://www.cnblogs.com/ping2yingshi/p/12437319.html