239. 滑动窗口最大值

双端队列实现单调队列

import java.util.ArrayDeque;

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {

        /**
         * 双端队列实现单调队列
         * 队列存储的是元素的索引
         */
        Deque<Integer> deque = new LinkedList<>();
        int[] res = new int[nums.length - k + 1];

        int left = 0;
        int right = 0;

        while (right < nums.length){

            /**
             * 当队列长度小于k时,每次将数组元素入队时,和队列最后一个元素比较,只存储大的那个。这样队列中存放的就是一个单调递减的数组,队首元素最大
             * 当队列长度等于k时,队首元素就是当前k区间的最大值,然后k区间右移。此时如果左边界是最大值,那就先要将队首出队,让第二大值成为新的队首,然后区间再右移
             */
            while (!deque.isEmpty() && nums[right] > nums[deque.getLast()]){
                deque.removeLast();
            }

            deque.add(right);

            if (right - left + 1 == k){

                res[left] = nums[deque.getFirst()];

                /**
                 * 此时左边界是nums[left],队首是res[left]
                 */
                if (res[left] == nums[left]){
                    deque.removeFirst();
                }

                left++;
            }

            right++;
        }

        return res;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(k)
 */

https://leetcode-cn.com/problems/sliding-window-maximum/

posted @ 2022-02-20 11:26  振袖秋枫问红叶  阅读(35)  评论(0)    收藏  举报