美文网首页
剑指 Offer 第59-1题:滑动窗口的最大值

剑指 Offer 第59-1题:滑动窗口的最大值

作者: 放开那个BUG | 来源:发表于2022-08-15 23:16 被阅读0次

    1、前言

    题目描述

    2、思路

    如果本题直接使用优先队列,在找最大值时比较方便,但是删除窗口的值很麻烦,每次都需要遍历堆中的值,最后会超时。

    其实此题主要是利用原来 minStack 的思路。minStack 保证栈顶一定是栈中的最小值,那我们可以定义一个双端队列,队列保持递减,所以对首总是最大的。

    算法流程:
    1)push 数进队列的时候,要保证队列尾开始的数比它大,否则一直移出队尾的数,直到符合条件,然后把此数放入队尾。
    2)pop 队列的时候,如果要 pop 的值与队首相等,那么要把队首的值 pop 掉。

    3、代码

    class Solution {
    
        class MaxQueue{
            private Deque<Integer> queue = new LinkedList<>();
    
            public void push(int n){
                while(!queue.isEmpty() && queue.peekLast() < n){
                    queue.pollLast();
                }
                queue.addLast(n);
            }
    
            public void pop(int n){
                if(queue.peekFirst() == n){
                    queue.pollFirst();
                }
            }
    
            public int max(){
                return queue.peekFirst();
            }
        }
    
    
        public int[] maxSlidingWindow(int[] nums, int k) {
            if(nums == null || nums.length == 0 || k == 0){
                return new int[]{};
            }
    
            MaxQueue queue = new MaxQueue();
            for(int i = 0; i < k; i++){
                queue.push(nums[i]);
            }
            int[] res = new int[nums.length - k + 1];
            res[0] = queue.max();
            queue.pop(nums[0]);
            for(int i = k; i < nums.length; i++){
                queue.push(nums[i]);
                res[i - k + 1] = queue.max();
                queue.pop(nums[i - k + 1]);
            }
    
            return res;
        }
    
    }
    

    相关文章

      网友评论

          本文标题:剑指 Offer 第59-1题:滑动窗口的最大值

          本文链接:https://www.haomeiwen.com/subject/dxobbrtx.html