面試題59 - II. 隊列的最大值

請定義一個隊列並實現函數 max_value 獲得隊列裏的最大值,要求函數max_value、push_back 和 pop_front 的時間複雜度都是O(1)。html

若隊列爲空,pop_front 和 max_value 須要返回 -1網絡

來源:力扣(LeetCode)
連接:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof
著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。
這道題能夠和以前的那個單調棧放在一塊兒看單調棧
1. 使用大頂堆來實現,傳入comparator比較器。比較簡單無腦。函數

class MaxQueue {
    private LinkedList<Integer> list;
    private PriorityQueue<Integer> max; 
    private Comparator<Integer> cam=new Comparator<>(){
            public int compare(Integer o1,Integer o2)
            {
                return o2-o1;
            }
       };
    public MaxQueue() {
       list=new LinkedList<>();
       max=new PriorityQueue<>(cam);
    }
    
    public int max_value() {
        return max.isEmpty()?-1:max.peek();
    }
    
    public void push_back(int value) {
        list.addLast(value);
        max.add(value);
    }
    
    public int pop_front() {
        if(list.isEmpty())
            return -1;
       int front=list.getFirst();
       if(!max.isEmpty())
            max.remove(front);
        return list.remove();
    }
}

/**
 * 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();
 */
  1. 使用兩個隊列來實現,原理是入隊時一個正常出入隊,一個是max隊,存放最大值信息,這裏的關鍵是對於入隊而言,若是入隊的這個值要比隊列最後一個值要小,那麼能夠直接入隊,否則大的話,就要刪去前面比它小的值,容易理解爲對於list而言這個位置比以前的幾個位置的最大值大的話,那麼他就是最大值了,因此max隊列的結構是降序排列的,若是出現一個最大的要加入,那麼以前全部元素都要去除,若是不是最大,那麼也要去除在他以前比他大的元素,知道遇到一個比他要小的。
class MaxQueue {
    private LinkedList<Integer> list;
    private LinkedList<Integer> max;
   
    public MaxQueue() {
       list=new LinkedList<>();
       max=new LinkedList<>();
    }
    
    public int max_value() {
      if(max.isEmpty())
        return -1;
      return max.peek();
    }
    
    public void push_back(int value) {
      list.add(value);
      
      while(!max.isEmpty()&&max.getLast()<value)
          max.pollLast();
      max.add(value);
    }
    
    public int pop_front() {
        if(list.isEmpty())
            return -1;
        int front =list.pollFirst();
        if(front==max.peek())
            max.remove();
        return front;
    }
}

/**
 * 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();
 */
相關文章
相關標籤/搜索