力扣239.滑动窗口最大值(单调队列)

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int n = nums.length;
        int[] ans = new int[n - k + 1];
        //单调队列,右边维护最大值,每次进来一个新的数,和队列最后一个数进行比较,保证队列从左向右单调递减
        //左边维护窗口大小,队列记录位置,如果超出窗口大小从左边出队
        Deque<Integer> q = new ArrayDeque<>();
        for (int i = 0; i < n; i++) {
            while (!q.isEmpty() && nums[q.getLast()] <= nums[i]) {
                q.removeLast();
            }
            q.addLast(i);
            int left = i - k + 1;
            if (q.getFirst() < left) {
                q.removeFirst();
            }
            if (left >= 0) {
                ans[left] = nums[q.getFirst()];
            }
        }
        return ans;

    }
}
posted @ 2026-01-07 10:00  Huangyien  阅读(7)  评论(0)    收藏  举报