当前位置: 代码迷 >> 综合 >> 算法练习--队列的最大值__单调队列
  详细解决方案

算法练习--队列的最大值__单调队列

热度:2   发布时间:2024-02-05 04:54:35.0

题目:

请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1

示例:

输入: 
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2]

个人思路:

用一个List记录队列,用另外一个List来记录最大值。记录最大值的List是个单调递减的,队首即为当前队列的最大值,如果队头和最大值一样,那么出队时一起出,否则表明最大值还在队中。

代码:

class MaxQueue {List<Integer> l;List<Integer> max;public MaxQueue() {l=new ArrayList();max=new ArrayList();}public int max_value() {if(max.size()==0){return -1;}return max.get(0);}public void push_back(int value) {l.add(value);while(max.size()!=0&&value>max.get(max.size()-1)){max.remove(max.size()-1);}max.add(value);}public int pop_front() {if(l.size()==0){return -1;}else{int i=l.get(0);if(i==max.get(0)){max.remove(0);}l.remove(0);return i;}}
}/*** 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();*/

 

  相关解决方案