核心的思路是:既然要達到O(n)
的複雜度,那麼就要保持窗口內的最大值在窗口邊界上。達到這個效果的方法就是濾掉窗口中沒用的元素。維護一個雙向隊列,隊列保存數組的下標,每當有新元素進入隊列時,從隊尾開始,刪掉連續的比新元素小的元素,而後將其插入到隊列末尾。之因此能夠這樣刪掉元素是基於:這些元素永遠都不會在一個窗口中成爲最大的元素。這樣就保證了隊首的元素始終是窗口(隊列)中最大的,而且隊列中始終保持了全部可能在一個窗口中成爲最大元素的元素。至於隊首元素的彈出,則只要判斷目前窗口的位置便可。數組
實現代碼:code
public class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if (nums == null || nums.length == 0) return nums; int[] result = new int[nums.length - k + 1]; LinkedList<Integer> queue = new LinkedList<Integer>(); for (int i = 0; i < nums.length; i++) { while (!queue.isEmpty() && nums[queue.peekLast()] < nums[i]) queue.pollLast(); queue.add(i); if (queue.peekFirst() == i - k) queue.pollFirst(); if (i >= k - 1) result[i - k + 1] = nums[queue.peekFirst()]; } return result; } }