hot100 239.滑动窗口最大值

思路:利用单调队列维护滑动窗口。

1.右边入(元素进入队尾,同时维护队列的单调性)。

2.左边出(元素离开队首)。

3.记录/维护答案(根据队首)。

为什么代码中的队首离开窗口写的是if而不是while?

答:

这是因为窗口在一步一步地向右滑动(像只蜗牛),所以元素也是一个一个地离开窗口,不会出现同一轮循环中有多个元素离开窗口的情况。

附代码:

java 复制代码
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int n = nums.length;
        int[] res = new int[n - k + 1]; //窗口个数
        LinkedList<Integer> queue = new LinkedList<>();
        for(int i = 0;i < n;i++){
            //1.右边入
            while(!queue.isEmpty() && nums[queue.getLast()] < nums[i]){
                queue.removeLast(); //移除所有比当前元素小的元素,确保队列中的元素是单调递减的
            }
            queue.addLast(i); //注意保存的是下标,这样下面可以判断队首是否离开窗口

            //2.左边出(移除过期元素)
            int left = i - k + 1; //窗口左端点
            if(queue.getFirst() < left){ //队首元素已不在窗口中,移除过期的队首元素
                queue.removeFirst();
            }
            //3.在窗口的左端点处记录答案
            if(left >= 0){
                //由于队首到队尾单调递减,所以窗口的最大值就在队首
                res[left] = nums[queue.getFirst()];
            }
        }
        return res;
    }
}
相关推荐
Chester_19995 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
裕晟资质规划6 小时前
武器装备科研生产单位保密资质申请方法论:条件模型与流程拆解
人工智能·算法
en.en..8 小时前
C语言 标准输入 / 输出缓冲区
算法
吃好睡好便好9 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
学习星球9 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
专注仿真10 小时前
Spring AI 实现智能对话系统项目指南
数据结构·spring·机器学习
靠沿11 小时前
贪心算法专题(二)
算法·贪心算法
间歇性努力持续性发呆的野生快乐选手11 小时前
高级数据结构:树状数组
数据结构
猎头南楼11 小时前
具身智能模型部署方向的能力要求与技术栈梳理
人工智能·深度学习·算法
啥都想学点的研究生12 小时前
一篇文章讲清楚:线性回归问题的求解——正规方程法
算法·机器学习·线性回归