LeetCode 239. 滑动窗口最大值

题目:

力扣

题解:

滑动窗口可以用双指针来实现,本题难点在于如何维护窗口内的最大值,可以使用单调队列,队列中维护当前窗口部分最大值并且单调递减,窗口移动时需要从新计算,时间复杂度:O(n)。

    public int[] maxSlidingWindow(int[] nums, int k) {
        int n = nums.length;
        Deque<Integer> deque = new LinkedList<>();
        int[] resultArray = new int[n-k+1];
        for(int i = 0; i < k; i++) {
            while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) {
                deque.pollLast();
            }
            deque.offerLast(i);
        }

        resultArray[0] = nums[deque.peekFirst()];
        for(int i = k; i < n; i++) {
            while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) {
                deque.pollLast();
            }

            deque.offerLast(i);
            // 移除不在窗口内的元素
            while (!deque.isEmpty() && deque.peekFirst() <= i-k) {
                deque.pollFirst();
            }

            resultArray[i-k+1] = nums[deque.peekFirst()];
        }

        return resultArray;
    }

上一篇:Cgroup和Namespace 入门实践


下一篇:leetcode-239. 滑动窗口最大值