剑指Offer面试题59:队列的最大值(双端队列,滑动窗口)

这道题,思路挺不好想的。

一种方法是实现一个两个栈组成的队列,并且这个队列可以弹出最大值,但是这样的实现在面试过程中,太耗费时间,练习的时候可以试试,因此,这里介绍比较好写的方法。

首先,设置两个index作为窗口下标记录,每次将小于当前要加入窗口的数据从队列中剔除,在遇到大于该数据的时候,将该数据加入队尾。每一次遍历要确保窗口大小,也就是要将窗口外的数据移除。

要记住双端队列的使用

    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums.length == 0){
            return nums;
        }
        Deque<Integer> deque = new LinkedList<>();
        int[] res = new int[nums.length - k + 1];
        for(int count_l = 0,count_p = 1-k;count_l<nums.length;count_l++,count_p++){
            if(count_p>0 && nums[count_p-1]==deque.peekLast()){
                deque.removeLast();
            }

            while(!deque.isEmpty()&&deque.peekFirst()<nums[count_l]){
                deque.removeFirst();
            }
            deque.addFirst(nums[count_l]);
            if(count_p>=0){
                res[count_p] = deque.peekLast();
            }

        }

        return res;
    }

猜你喜欢

转载自blog.csdn.net/qq_40473204/article/details/115190072