剑指 Offer 59 - I. 滑动窗口的最大值--定长滑动窗口

110 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

在这里插入图片描述 规则如下:

  • 将数加入队列时如果该数大于队列尾数,该尾数removeLast
  • 如果当前队列头位置不在窗口内(遍历时数 i - k == getFirst())将头结点移除
  • i > k-1之后的遍历,每次移动都有新窗口

通过上述三个操作,可以保持每个窗口最大值始终在队列头的位置。

class Solution {
   public int[] maxSlidingWindow(int[] nums, int k) {
        Deque<Integer> de = new LinkedList();
        int[] arr = new int[nums.length - k + 1];
        int x = 0;
        if(nums == null || nums.length == 0) return new int[0];
        for(int i = 0;i < nums.length;i++){
            if(!de.isEmpty() && de.getFirst() == i - k){  //进入下一个窗口,当前的头需要丢掉
                de.removeFirst();
            }
            while(!de.isEmpty() && nums[de.getLast()] < nums[i]){  //如果当前值大于尾,将尾丢掉
                de.removeLast();
            }
            de.addLast(i); //加入当前值
            //上述两个操作使得每次窗口最大的值在队列头
            if(i >= k - 1) arr[x++] = nums[de.getFirst()];
        }
        return arr;
    }
}