Sliding Window Maximum@LeetCode

Sliding Window Maximum

核心的思路是:既然要達到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;
    }
}
相關文章
相關標籤/搜索