239. Sliding Window Maximum

这题也是用双端队列做。
保留又大又新的元素

队列里是一个递减序列,因为有新的又新又大的,直接把老的小的KO了,只剩下那些老的大的元素。

记得要每次检查队首。

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums.length == 0) {
            int[] result = new int[0];
            return result;
        }
        Deque deque = new LinkedList<>();
        int N = nums.length;
        int[] ans = new int[N - k + 1];
        for (int i = 0; i < N; i++) {
            while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) {
                deque.pollLast();
            }
            deque.offer(i);
            while (deque.peekFirst() + k - 1 < i) deque.pollFirst();
            if (i >= k - 1) {
                ans[i - k + 1] = nums[deque.peekFirst()];
            }
        }
        return ans;
    }
}

你可能感兴趣的:(239. Sliding Window Maximum)