【每日一题】【双端降序队列Deque】2021年12月28日-239. 滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sliding-window-maximum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

 答案:注意思路使用双端降序队列

//Deque双端队列
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int len = nums.length;
        int[] res = new int[len - k + 1];
        //或Deque
        LinkedList<Integer> queue = new LinkedList<>();
        for(int i = 0; i < len; i++) {
            //当最后的元素小于数组当前元素,弹出最后的元素
            while(!queue.isEmpty() && nums[i] >= nums[queue.peekLast()]) {
                queue.pollLast();
            }
            queue.addLast(i);
            //当最前面的位置不在k个元素的范围时,从前面出队
            //小于i-k时
            if(queue.peekFirst() <= i - k) { 
                queue.pollFirst();
            }
            //当元素达到k个时,将队头元素加入数组
            if(i - k + 1 >= 0) {
                //加入时不出队
                res[i - k + 1] = nums[queue.peekFirst()];
            }
        }
        return res;
    }
}


class Solution {
    /**
        注意尾部头部什么时候移除、结果添加
        2循环1判断
     */
    public int[] maxSlidingWindow(int[] nums, int k) {
        int len = nums.length;
        Deque<Integer> queue = new LinkedList<>();
        int[] res = new int[len - k + 1];
        for(int i = 0; i < len; i++) {
            //元素移除
            while(!queue.isEmpty() &&  nums[i] >= nums[queue.peekLast()]) {
                queue.pollLast();
            }
            //添加元素的函数
            queue.offer(i);
            //移除头元素,while,当头的位置不在k个区间时
            while(queue.peekFirst() <= i - k) {
                queue.pollFirst();
            }
            //添加元素到res,if,当窗口长度达到k个时,☆☆☆☆
            if(i - k + 1 >= 0) {
                res[i - k + 1] = nums[queue.peekFirst()];
            }
        }
        return res;
    }
}

 

posted @ 2021-12-28 19:54  哥们要飞  阅读(34)  评论(0编辑  收藏  举报