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;
    }
}
相关推荐
wengqidaifeng9 小时前
探索数据结构(二):空间复杂度
c语言·开发语言·数据结构
难得的我们9 小时前
单元测试在C++项目中的实践
开发语言·c++·算法
Once_day9 小时前
代码训练总结(1)算法和数据结构的框架思维
数据结构·算法
鹿角片ljp9 小时前
力扣125.验证回文串-双指针
数据结构·算法
夏乌_Wx9 小时前
练题100天——DAY44:回文链表 ★★☆☆☆
数据结构
We་ct9 小时前
LeetCode 30. 串联所有单词的子串:从暴力到高效,滑动窗口优化详解
前端·算法·leetcode·typescript
-Try hard-9 小时前
数据结构|概念及单向有头链表
数据结构·算法·vim
历程里程碑9 小时前
子串----和为K的子数组
大数据·python·算法·leetcode·elasticsearch·搜索引擎·哈希算法
郝学胜-神的一滴9 小时前
Python List操作:+、+=、extend的深度解析
开发语言·数据结构·python·程序人生·架构·list
Aaron15889 小时前
通信灵敏度计算与雷达灵敏度计算对比分析
网络·人工智能·深度学习·算法·fpga开发·信息与通信·信号处理