使用单调队列求滑动窗口最大值

单调队列:队列元素之间的关系具有单调性(从队首到队尾单调递增/递减),队首与队尾进行插入与删除操作,使队列保持单调递增/递减,由双端队列deque实现。

通过例题对单调队列进行分析掌握:

使用单调队列解决上述问题,基本思路:

1.创建一个单调队列,遍历nums数组生成不同的滑动窗口。

2.首先判断滑动窗口中的元素是否满足单调递减的特性,如果不满足,则反复删除队首元素,直到满足单调递减特性,此时使用peekFirst()方法获取队首即队列中的最大值。

3.再创建一个结果数组,将每个窗口中的最大值(每个队列中的第一个元素)依次添加到结果数组中。

4.每次滑动窗口前需将队列中第一个元素与窗口第一个元素进行比较,如果相等则使用pollFirst()方法将队列中第一个元素删除,确保窗口中元素的数量不变。

5.每次滑动窗口需添加nums数组中下一个元素到队列中。

代码如下:

java 复制代码
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {

        //创建队列
        Deque<Integer> deque = new LinkedList();
        //创建结果数组
        int[] result = new int[nums.length-k+1];
        //nums数组循环
        for(int j=0,i=1-k;j<nums.length;i++,j++){
            //删除deque中对应的nums[i-1](滑动窗口时将窗口第一个元素删除)
            if(i>0 && deque.peekFirst() == nums[i-1]){  //i=2
                deque.pollFirst();
            }
            //判断队列不为空,并且当数组下一个元素大于队尾(最小值)时,循环删除队尾元素,直到队列单调递减
            while(!deque.isEmpty() && nums[j] > deque.peekLast()){
                deque.pollLast();
            }
            //将数组下一个元素添加到队尾
            deque.addLast(nums[j]);
            //每一次滑动窗口,将队列中的队首元素(最大值)添加到结果数组
            if(i >= 0){
                result[i] = deque.peekFirst();
            }
        }
        return result;
    }
}
相关推荐
代码栈上的思考6 小时前
双指针法:从三道经典题看双指针的核心思想
数据结构·算法
重生之后端学习7 小时前
114. 二叉树展开为链表
java·数据结构·算法·链表·职场和发展·深度优先
浅念-8 小时前
C++ 模板初阶:从泛型编程到函数模板与类模板
c语言·开发语言·数据结构·c++·笔记·学习
Bear on Toilet8 小时前
BFS_FloodFill_46 . 腐烂的橘子问题
数据结构·c++·算法·leetcode·宽度优先
ccLianLian10 小时前
数据结构·链表的数组实现
数据结构·链表
梦游钓鱼11 小时前
c++中一维数组和二维数组的应用
数据结构·c++·算法
郝学胜-神的一滴11 小时前
深入解析Effective Modern C++条款35:基于任务与基于线程编程的哲学与实践
开发语言·数据结构·c++·程序人生
楠秋92013 小时前
代码随想录算法训练营第三十二天| 509. 斐波那契数 、 70. 爬楼梯 、746. 使用最小花费爬楼梯
数据结构·算法·leetcode·动态规划
㓗冽13 小时前
最大效益(二维数组)-基础题76th + 螺旋方阵(二维数组)-基础题77th + 方块转换(二维数组)-基础题78th
数据结构·算法
元亓亓亓13 小时前
LeetCode热题100--239. 滑动窗口最大值--困难
数据结构·算法·leetcode