力扣239.滑动窗口最大值 | 双端队列

分析

1.队列存数组的下标优势:既能通过索引获得值,又能得知索引以判断边界条件。
2.循环遍历数组n个。遍历的当前数cur与当前队列中的最后一个数比较 直到该队列为空 或 队列尾部的数大于cur,就把队尾的数 pollLast清出队列。然后把cur放进队列。
3.结尾判断一下是否已经走出k步(i >= k-1 只要超过k-1则意味着到达每个队列的队尾,此时队列首部的值就是该区间最大值(os:因为在上一步不断更新队列值的时候已经更新过队列)),就把加入res[i - k + 1] 共n-k+1个。
4.最后在迭代内部需要判断双端队列队首所存储的索引代表的最大值是否已经“滑出”当前窗口的范围​,也就是deque.peekFirst() < i - k + 1,索引是否已经超出当前边界(当前左边界i - k + 1),首尾呼应。

代码

点击查看代码
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        Deque<Integer> deque  = new LinkedList<>();
        int n = nums.length;
        int[] res = new int[n-k+1];
        
        for(int i = 0; i < n;i++){
            if(!deque.isEmpty() && deque.peekFirst() < i-k+1 ){
                deque.pollFirst();
            }
            while(!deque.isEmpty() && nums[deque.peekLast()] < nums[i]){
                deque.pollLast();
            }
            deque.offerLast(i);

            if(i >= (k-1)){
                res[i-k+1] = nums[deque.peekFirst()];
            }
        }
        return res;
    }
}
posted @ 2025-09-04 23:46  柳成荫y  阅读(9)  评论(0)    收藏  举报