题解——双端队列

作者: Yjnull | 来源:发表于2019-10-09 10:53 被阅读0次

双端队列题解

239. 滑动窗口最大值

牛客链接
LeetCode 链接

方法一:暴力法

该题最直接的解法,直接遍历每个滑动窗口,找到每个窗口的最大值即可。一共会有 N - k + 1 个滑动窗口,每个滑动窗口有 k 个元素,所以时间复杂度为 O(Nk),表现较差。

方法二:双端队列

这里采用 以双向链表实现的 LinkedList 作为双端队列。
算法

  • 遍历整个数组。
  • 把当前元素的索引添加到双端队列中,在添加之前首先清理双端队列:
    • 遍历当前双端队列。
    • 移除比当前元素小的所有元素,它们不可能是最大的,保证双端队列队首到队尾按从大到小的顺序排列,这样保证了队首永远是当前窗口最大的。
  • 如果队首的索引超出了窗口,则移除队首。
  • 将对首元素添加到输出数组中。
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums == null || nums.length == 0) return new int[0];
        LinkedList<Integer> qmax = new LinkedList<>();
        int[] result = new int[nums.length - k + 1];
        int index = 0;
        for(int i = 0; i < nums.length; i++) {
            // 遍历双端队列,将比当前元素小的所有元素移除
            while(!qmax.isEmpty() && nums[i] >= nums[qmax.peekLast()]) {
                qmax.pollLast();
            }
            // 将当前元素的索引添加到队列
            qmax.addLast(i);
            // 如果队首的索引超出了窗口,移除
            if(qmax.peekFirst() == i - k) {
                qmax.pollFirst();
            }
            // 第一个窗口生成,构建输出结果
            if(i >= k - 1) {
                result[index++] = nums[qmax.peekFirst()];
            }
        }
        return result;
    }

复杂度

  • 时间复杂度:O(N),每个元素被处理两次,其索引被添加到双端队列,和被双端队列删除。
  • 空间复杂度:O(N),输出数组使用了 O(N - k + 1) ,双端队列使用了 O(k)。

相关文章

  • 题解——双端队列

    双端队列题解 239. 滑动窗口最大值 牛客链接LeetCode 链接 方法一:暴力法 该题最直接的解法,直接遍历...

  • 7.双端队列Deque

    目录:1.双端队列的定义2.双端队列的图解3.双端队列定义操作4.双端队列的实现 1.双端队列的定义 2.双端队列...

  • 双端队列

    双端队列 双端队列是与队列类似的项的有序集合。双端队列有两个端部,首部和尾部,并且项在集合中保持不变。双端队不同的...

  • 数据结构-队列(Queue)-FIFO

    数据结构-队列(Queue)-FIFO 队列的接口设计 双端队列-Deque 循环队列-CircleQueue 双...

  • 数据结构与算法之队列(五)

    目录 队列简介队列的接口设计用栈实现队列双端队列实现循环队列实现循环双端队列 一 简介 队列是一种特殊的线性表,只...

  • 队列 - 双端队列 - 循环队列 - 循环双端队列

    队列是一种特殊的线性表,只能在头尾两端进行操作队尾(rear):只能从队尾添加元素,一般叫做 enQueue,入队...

  • 数据结构之「双端队列」

    什么是双端队列? 双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double...

  • 数据结构(四) -- 双端队列

    一,双端队列 队列的一种变型--双端队列(Double-ended queue),简称为Deque。顾名思义,也就...

  • ARTS第八周20200712

    Algorithm 设计循环双端队列 设计实现双端队列。 你的实现需要支持以下操作:MyCircularDeque...

  • java基础之队列

    双端队列Deque 双端队列, 先看下整体结构 如图, 主要是addFirst 和 addLast方法, 有很多类...

网友评论

    本文标题:题解——双端队列

    本文链接:https://www.haomeiwen.com/subject/jsbwpctx.html