0
点赞
收藏
分享

微信扫一扫

【栈和队列专题】—— 滑动窗口

数数扁桃 2022-04-23 阅读 50

双端队列

1.双端队列的概念:
普通队列是可以队首删除元素,队尾添加元素。对于双端队列,在队首、队尾都可以进行入队和出队的操作。

  • 在一端进行出队和入队的操作,就有点类似栈的意思了,后入先出
  • 也存在受限的双端队列:
    一端可以入队、出队操作,另一端只能进行入队操作;
    一端可以入队、出队操作,另一端只能进行出队操作。

2.双端队列的基本操作:


LeetCode 239: 滑动窗口最大值

在这里插入图片描述
⭕️ 解题思路:

(1)创建一个结果集数组,大小为nums.length - k + 1

(2)创建一个双端队列,保存放到队列中的元素的索引。

(3)判断当前最大值是否还在滑动窗口中,如果已经不再窗口中了,要将这个元素的索引从队首弹出

(4)将窗口中的最大值保存到结果集数组中

⭕️ 代码部分:

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {

        //特殊情况处理
        if(nums == null || nums.length < 2){
            return nums;
        }
        //结果集数组
        int [] res = new int [nums.length - k + 1];
        //用双端队列来保存数组索引
        LinkedList<Integer> queue = new LinkedList();

        //遍历数组
        for(int i = 0; i < nums.length; i++){
            //如果队列不为空,当前对内元素小于下一个入队的元素,那么弹出队内的元素
            while(!queue.isEmpty() && nums[queue.peekLast()] <= nums[i]){
                queue.pollLast();
            }

            //将当前元素的索引入队
            queue.addLast(i);

            //判断队列中的值是否有效
            if(queue.peek() <= i - k){
                queue.poll();
            }

            //将滑块中的最大值保存到结果集中,主要控制好第一个录入的元素即可
            if(i + 1 >= k){
                res[i - k + 1] = nums[queue.peek()];
            }
        }
        return res;
    }
}
举报

相关推荐

0 条评论