1 | 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。 |
因为求队列的最大值不会改变队列中的元素的数量,所以只需要维护一个双端辅助队列
辅助队列中维护最大值的递减序列,当插入一个元素时:
- 如果这个元素之前的元素都小于他,那么这个元素在他前面的元素弹出之前,都是最大值,所以在最大值队列中,当前插入值之前的元素都可以删除了。
- 如果这个元素小于队列中之前的最后一个元素,那么将其插入,当他前面的元素被弹出时,他就是最大的元素。
如果需要查询最大元素,那么只需要查询队头的元素。
当真正维护所有元素的队列中的某个元素删除时,只需要判断当前删除的元素是不是最大值队列中的第一个元素就可以继续维护最大元素。
1 | class MaxQueue { |
参考文献
作者:LeetCode-Solution 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。