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;
    }
}
相关推荐
小O的算法实验室19 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
‎ദ്ദിᵔ.˛.ᵔ₎19 小时前
LIST 的相关知识
数据结构·list
M--Y20 小时前
Redis常用数据类型
数据结构·数据库·redis
郭涤生20 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿20 小时前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz21 小时前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能21 小时前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****21 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能21 小时前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能21 小时前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数