zoukankan      html  css  js  c++  java
  • 【LeetCode】面试题59

    题目链接:

    面试题59 - II. 队列的最大值

    题目描述:

    请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数 max_valuepush_backpop_front 的时间复杂度都是 O(1)

    若队列为空,pop_frontmax_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"]
    [[],[],[]]
    输出:[[1,2,3,4,5],[4,5,6],[7,8]]
    

    思路:

    此题的关键在于 max_value 如何实现,push_backpop_front 都是队列现成的操作。之前做过栈类似的题目:155. 最小栈面试题30. 包含min函数的栈。在这里可以运用类似的思想,用两个队列实现题目要求。

    题目要求找出队列中的最大值,注意到:当一个元素进入队列的时候,它前面所有比它小的元素就不会再对答案产生影响

    按照这个思路,可以在元素入队时进行如下的操作:从队列尾部入队元素value时,提前取出队列中所有比value小的元素,使得队列中只保留对结果有影响的数字。这样等价于要求维持队列单调递减,即要保证每个元素的前面都没有比它小的元素。

    具体实现: 在入队元素value时,先从队列尾部依次取出比value小的元素,直到遇到比value大的元素为止,这就保证了这个队列是单调递减的。因此设立一个双端队列deque来存储这个递减队列,另设一个普通队列queue存储所有元素。

    • push_backqueue入队;对deque进行上述检查后决定是否入队。
    • pop_frontqueue出队;若出队元素与deque队首元素相等,deque出队。
    • max_valuedeque队首元素。

    代码实现:

    class MaxQueue {
        // 辅助队列
        private Queue<Integer> queue;
        // 双端队列
        private Deque<Integer> deque;
    
        public MaxQueue() {
            queue = new LinkedList<>();
            deque = new ArrayDeque<>();
        }
        
        public int max_value() {
            if (deque.isEmpty()) {
                return -1;
            }
            return deque.peekFirst();
        }
        
        public void push_back(int value) {
            while (!deque.isEmpty() && deque.peekLast() < value) {
                deque.removeLast();
            }
            deque.addLast(value);
            queue.add(value);
        }
        
        public int pop_front() {
            if (queue.isEmpty()) {
                return -1;
            }
            int result = queue.peek();
            if (result == deque.peek()) {
                deque.remove();
            }
            queue.remove();
            return result;
        }
    }
    
    /**
     * 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();
     */
    
  • 相关阅读:
    Hihocoder 1275 扫地机器人 计算几何
    CodeForces 771C Bear and Tree Jumps 树形DP
    CodeForces 778D Parquet Re-laying 构造
    CodeForces 785E Anton and Permutation 分块
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale 二分
    Hexo Next 接入 google AdSense 广告
    如何统计 Hexo 网站的访问地区和IP
    Design and Implementation of Global Path Planning System for Unmanned Surface Vehicle among Multiple Task Points
    通过ODBC接口访问人大金仓数据库
  • 原文地址:https://www.cnblogs.com/ME-WE/p/12433569.html
Copyright © 2011-2022 走看看